Hibernate TinyInt列活动在HQL中正确映射为布尔值,但在使用本机查询时会出现IllegalArgument异常
我更改了一个表并添加了一个活动的tinyInt列 它在数据库中有1/0,当在HQL中使用时,它在Java中正确映射为布尔值true/falseHibernate TinyInt列活动在HQL中正确映射为布尔值,但在使用本机查询时会出现IllegalArgument异常,hibernate,Hibernate,我更改了一个表并添加了一个活动的tinyInt列 它在数据库中有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 (Se
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();
对于不同的组合(两者都在一起,只有@Type而不是columnDefinition等等),它不起作用
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'))";
到
要仅选择元组(在本例中是,chainID),我需要这样做,以便hibernate库不会尝试映射活动列,如果我将实体传递给它而不是POJO,它就会这样做。但这是一项艰苦的工作。想象一下,如果有几十个本机查询。我得换衣服了
从消息中选择*
并分析每个查询,查看业务逻辑中使用了什么,只在查询中添加那些元组,这样可以避免新修改的活动列使这项工作变得无用和容易出错
有人知道吗?我将不胜感激我认为问题在于您使用的是结果转换器,而不是将结果指定为实体:
Query query = ormSession.createSQLQuery( query ).addEntity( Message.class );
有没有不使用HQL查询的原因?如何运行本机查询并将结果转换为消息?@Davide我添加了代码,如果需要任何其他信息,请告诉我elsePerhaps
.setParameter(1,true,ShortType.INSTANCE)
是否可行?@Davide不使用HQL查询的原因是,在编写此查询时,我们认为“对DB的点击次数越少越好”,而使用HQL执行此操作将花费3次查询,即3次往返。无论如何,库不应该停留在本机上,因为它在实体数据库映射方面做得很好,或者至少在不抛出IllegalArgumentExc for property setter的情况下为本机提供一个解决方案……这很有效,谢谢Davide。hibernate文档实际上提到可以对本机查询使用addEntity。
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'))";
Query query = ormSession.createSQLQuery( query ).addEntity( Message.class );