首页 > 解决方案 > 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 异常 ....”。

为什么在本机查询的情况下无法将活动映射到布尔值?

我试过的 -

  1. 为我的实体中的Active列添加以下内容
    @Type(type = "org.hibernate.type.NumericBooleanType")   
    @Column(columnDefinition=”TINYINT(1)”)

使用不同的组合(两者一起,只有 @Type 但不是 columnDefinition 等。)它不起作用。

  1. 我什至试着做一个

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列使这种解决方法变得无用且容易出错。

有人有什么想法吗?我将感激不尽

标签: hibernate

解决方案


我认为问题在于您使用的是结果转换器,而不是将结果指定为实体:

Query query = ormSession.createSQLQuery( query ).addEntity( Message.class );

推荐阅读