【问题标题】:Hibernate 4 returns list of null object for native sql queryHibernate 4返回本机sql查询的空对象列表
【发布时间】:2018-04-04 23:54:59
【问题描述】:

我最近使用 Spring 4.3.9 从休眠 3.5 升级到 4.3.11 在升级之前一切正常。升级后出现此错误。

环境: 爪哇 8, 雄猫 7.0.23, 休眠 4.3.11, 春季 4.3.9, MSSQL 服务器 2008,

通过hibernate执行以下sql查询时,我们得到了列表中大小正确但对象为null的空对象列表。

查询:

select DISTINCT(HIERARCHY_ID) from BASETYPE_HIERARCHY_MAPPING 
where BASETYPE_ID IN (select BASETYPE_ID from BASETYPE_GROUP_MAPPING 
where GROUP_ID IN (select GROUP_ID from USER_GROUP_MAPPING where USER_ID like(select ID from USER where USERID='7')))

Java 代码:

String sqlQuery="select DISTINCT(HIERARCHY_ID) from BASETYPE_HIERARCHY_MAPPING where BASETYPE_ID IN "
                        + "(select BASETYPE_ID from BASETYPE_GROUP_MAPPING where GROUP_ID IN "
                        + "(select GROUP_ID from USER_GROUP_MAPPING where USER_ID=(select ID from USER where USERID=:userId)))";

Query query = session.createSQLQuery(sqlQuery);
query.setParameter("userId", userId);
List<String> typeId = query.list();

在空对象的结果列表中。我发现 HQL 有类似类型的问题(解决方案是映射错误),但它的 sql 查询很简单。

类似问题参考链接: Hibernate returns list of nulls although executed SQL returns values

【问题讨论】:

    标签: java hibernate hibernate-4.x spring-orm


    【解决方案1】:

    通过在查询中指定列的返回类型,解决了使用休眠标量的问题。

    addScalar()

    在 java 代码中进行了以下更改以解决该问题。

    String sqlQuery="select DISTINCT(HIERARCHY_ID) from BASETYPE_HIERARCHY_MAPPING where BASETYPE_ID IN "
                            + "(select BASETYPE_ID from BASETYPE_GROUP_MAPPING where GROUP_ID IN "
                            + "(select GROUP_ID from USER_GROUP_MAPPING where USER_ID=(select ID from USER where USERID=:userId)))";
    
    Query query = session.createSQLQuery(sqlQuery).addScalar("HIERARCHY_ID", StringType.INSTANCE);
    query.setParameter("userId", userId);
    List<String> typeId = query.list();
    

    但是在我们的项目中使用了很多 sql 查询,所以我需要在所有 queires 中更改任何更好的解决方案,而不是这个 addScalar() 或者为什么它从休眠 4 强制,它在 3.5 中工作正常

    【讨论】:

      【解决方案2】:

      您得到空值是因为您的列未在此处映射。您可以在此处执行此步骤。 做一个类来获取HIERARCHY_ID,像这样

      public class ABC{
      
          private long id;
      }
      

      然后像这样写查询

      @Query("SELECT new com.abc.abc.ABC (t.id) from table t")
      

      这将为您提供 ABC 对象的列表,我认为它会起作用。

      【讨论】:

      • 你说的是使用HQL而不是SQL,但是在hibernate中我们可以执行sql查询并获取列表结果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多