我有一个非常复杂的查询,不能转换为HQL,所以我必须使用SQL。我将查询放入NamedNativeQuery注释中。它“应该”返回两个值的列表(List<Object[2]>
)。当我尝试运行时,会话无法加载查询,因为我没有定义映射或结果类。我无法创建一个简单的类来映射这些值,因为注释必须放在特定的DAO项目中,并且使用查询的代码存在于自己的项目中。 (DAO项目更通用,项目中的实体直接映射到我们数据库中的表。我不能在这个项目中创建一个小类来映射到我的查询结果,因为它不适合这个项目的模式)
我有没有办法将查询结果映射到一个更通用的类,或者更好的是我有一些方法可以让List<Object[]>
返回而不必映射任何特定的东西?当我想要做的就是执行查询并将结果作为数组返回时,Hibernate必须以这种特殊方式工作,这是非常令人沮丧的。
答案 0 :(得分:3)
这是我用于在List<Object[]>
中存储SQL查询结果的代码。也许你可以根据自己的需要进行调整:
public List<Object[]> executeSelectQuery(String sqlQuery) {
List<Object[]> cleanedResults = new ArrayList<Object[]>();
SQLQuery query = sessionFactory.getCurrentSession().createSQLQuery(sqlQuery);
List<Object[]> hibernateResults = query.list();
// Hibernate does not return always a List<Object[]>, but a list of strings or integers, so it is necessary to check the returned values
if (!hibernateResults.isEmpty()) {
if (hibernateResults.get(0) instanceof Object[]) {
cleanedResults = hibernateResults;
} else {
Object[] row;
// Use a 'for' because 'foreach' sometimes has casting exceptions converting to object
for (int i = 0; i < hibernateResults.size(); i++) {
row = new Object[1];
row[0] = hibernateResults.get(i);
cleanedResults.add(row);
}
}
}
return cleanedResults;
}
答案 1 :(得分:1)
NamedNativeQuery
支持附加注释,以便您将结果映射到POJO:
@SqlResultSetMapping(name="MyResult.Mapping", entities = {
@EntityResult(entityClass=MyResult.class, fields = {
@FieldResult(name="email", column="email"),
@FieldResult(name="name", column="name")
})
})
然后将resultSetMapping="MyResult.Mapping"
添加到您的NamedNativeQuery
注释中。
答案 2 :(得分:0)
我最终没有使用NamedNativeQueries因为它们不适合我。相反,我只使用session.createSQLQuery
和常量字符串,它起作用了。
我可能没有正确地说出我的问题。我无法使用@SqlResultSetMapping
,因为根据我正在使用的代码的结构,我没有任何要映射的类。我的查询有作为List<Object[]>
结果出来,并且没有办法用NamedNativeQueries做到这一点,因为Hibernate不支持它。