Hibernate TinyInt列活动在HQL中正确映射为布尔值,但在使用本机查询时会出现IllegalArgument异常

Hibernate 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

我更改了一个表并添加了一个活动的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 (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等等),它不起作用

  • 我甚至试着做一个
  • 标量.put(“活动”,新布尔值); 这也不起作用

    更新:我必须在没有活动列的情况下创建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'))";
    

    要仅选择元组(在本例中是,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 );