Hibernate 4返回本机sql查询的null对象列表

时间:2017-10-24 08:59:28

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

我最近使用Spring 4.3.9从hibernate 3.5升级到4.3.11升级之前一切正常。升级后,我收到此错误。

环境: Java 8, Tomcat 7.0.23, Hibernate 4.3.11, 春季4.3.9, MSSQL Server 2008,

在通过hibernate执行以下sql查询时,我们在列表中获取了具有正确大小的null对象列表,但是对象为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();

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

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

2 个答案:

答案 0 :(得分:0)

由于您未在此处映射列,因此您将获得null。你可以在这里完成这一步。 创建一个类来获取HIERARCHY_ID,就像这样

public class ABC{

    private long id;
}

然后像这样写

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

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

答案 1 :(得分:0)

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

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()或为什么它从hibernate 4强制执行,它在3.5中运行良好