我最近使用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
答案 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中运行良好