hibernate - TinyInt 列活动正确映射到 HQL 中的布尔值,但在使用本机查询时给出 IllegalArgument 异常
问题描述
我更改了一个表并添加了一个 tinyInt 列Active
@Column(name = "Active")
private boolean active;
在数据库中有 1/0 并且在 HQL 中使用时正确映射到 Java 中的布尔值 true/false
Query query = sess.createQuery("FROM Message where Active = false")
retval = query.list();
但是如果我使用本机查询
String query = "Select * from Message where ChainID IN (Select ChainID from ChainUser where UserId = :p_contactUserID and ChainID in "
+ " (Select ChainID FROM ChainUser WHERE UserID = :p_userID AND Type='MESSAGE'))";
Dictionary<String, String> parameters = new Hashtable<String, String>();
parameters.put("p_contactUserID", Integer.toString(contactUserID));
parameters.put("p_userID", Integer.toString(userID));
Query query = sess.createSQLQuery(query ).setResultTransformer(Transformers.aliasToBean(instance.getClass()));
for (String key : Collections.list(parameters.keys())) {
query.setParameter(key, parameters.get(key));
}
retval = query.list();
使用本机查询时给出“属性活动的 IllegalArgument 异常 ....”。
为什么在本机查询的情况下无法将活动映射到布尔值?
我试过的 -
- 为我的实体中的Active列添加以下内容
@Type(type = "org.hibernate.type.NumericBooleanType")
@Column(columnDefinition=”TINYINT(1)”)
使用不同的组合(两者一起,只有 @Type 但不是 columnDefinition 等。)它不起作用。
- 我什至试着做一个
scalar.put("Active", new Boolean); 这也没有奏效。
更新:我必须解决创建没有 Active 列的 POJO 并将我的本机查询从
Select * from Message where ChainID IN (Select ChainID from ChainUser where UserId = :p_contactUserID and ChainID in "
+ " (Select ChainID FROM ChainUser WHERE UserID = :p_userID AND Type='MESSAGE'))";
至
Select ChainID from Message where ChainID IN (Select ChainID from ChainUser where UserId = :p_contactUserID and ChainID in "
+ " (Select ChainID FROM ChainUser WHERE UserID = :p_userID AND Type='MESSAGE'))";
只选择我需要的元组(在本例中为chainID),这样休眠库就不会尝试映射活动列,如果我将实体而不是 POJO 传递给它,它就会这样做。但这种变通方法是艰苦的工作。想象一下,如果有几十个本机查询。我将不得不改变
从消息中选择 *
并分析每个查询以查看业务逻辑中使用的内容,并仅在查询中添加那些元组,以避免新更改的Active列使这种解决方法变得无用且容易出错。
有人有什么想法吗?我将感激不尽
解决方案
我认为问题在于您使用的是结果转换器,而不是将结果指定为实体:
Query query = ormSession.createSQLQuery( query ).addEntity( Message.class );
推荐阅读
- c# - Firebase SDK 生成 Firebase Android 资源文件 google-services.xml 失败
- ruby-on-rails - 公司不是一个模块(以前的公司定义在这里)
- c# - 如何配置运行**本地**的 Azure 函数以使用 Azure B2C 执行身份验证?
- logic - 如何简化电路
- javascript - 我如何从带有 && 或 || 的“复杂”条件组合中编写干净的条件
- sql-server - FME 中的 SQL Server 执行计划
- c# - 如何为具有另一个类型参数的泛型类编写具有一个类型参数的泛型扩展方法
- javascript - 谁能向我解释为什么我的变量“sum”没有计算数组“arrPrice”的总和?
- python - 从xml中提取所有父节点和子节点
- c# - 将 TextReader 标记为只读