Java Hibernate-如何在不映射到特定类的情况下执行命名本机查询
我有一个非常复杂的查询,不能转换为HQL,所以我必须使用SQL。我将查询放入NamedNativeQuery注释中。它“应该”返回两个值的列表(Java Hibernate-如何在不映射到特定类的情况下执行命名本机查询,java,sql,hibernate,Java,Sql,Hibernate,我有一个非常复杂的查询,不能转换为HQL,所以我必须使用SQL。我将查询放入NamedNativeQuery注释中。它“应该”返回两个值的列表(list)。当我尝试运行时,会话无法加载查询,因为我没有定义映射或结果类。我无法创建一个简单的类来映射这些值,因为注释必须放在特定的DAO项目中,并且使用查询的代码存在于它自己的项目中。(DAO项目更通用,该项目中的实体直接映射到数据库中的表。我不能在此项目中创建一个小类来映射到我的查询结果,因为它不适合此项目的架构) 是否有一种方法可以将查询结果映射到
list
)。当我尝试运行时,会话无法加载查询,因为我没有定义映射或结果类。我无法创建一个简单的类来映射这些值,因为注释必须放在特定的DAO项目中,并且使用查询的代码存在于它自己的项目中。(DAO项目更通用,该项目中的实体直接映射到数据库中的表。我不能在此项目中创建一个小类来映射到我的查询结果,因为它不适合此项目的架构)
是否有一种方法可以将查询结果映射到更通用的类,或者更好,是否有一种方法可以让我只获取
列表
,而不必映射到任何特定的类?当我只想执行一个查询并将结果作为数组返回时,Hibernate必须以这种特殊的方式工作,这非常令人沮丧。aNamedNativeRequesty
支持添加注释,以允许您将结果映射到POJO:
@SqlResultSetMapping(name="MyResult.Mapping", entities = {
@EntityResult(entityClass=MyResult.class, fields = {
@FieldResult(name="email", column="email"),
@FieldResult(name="name", column="name")
})
})
然后将
resultSetMapping=“MyResult.Mapping”
添加到您的namedNativeRequesty
注释中。这是我用于将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;
}
public List executeSelectQuery(字符串sqlQuery){
List cleanedResults=new ArrayList();
SQLQuery=sessionFactory.getCurrentSession().createSQLQuery(SQLQuery);
List hibernateResults=query.List();
//Hibernate并不总是返回一个列表,而是一个字符串或整数列表,因此有必要检查返回的值
如果(!hibernateResults.isEmpty()){
if(hibernateResults.get(0)对象[]的实例){
cleanedResults=休眠结果;
}否则{
对象[]行;
//使用“for”,因为“foreach”有时会有转换为对象的强制转换异常
对于(int i=0;i
我最终没有使用NamedNativeRequesties,因为它们不适合我。相反,我只是使用带有常量字符串的session.createSQLQuery
,它就工作了
我可能没有恰当地表达我的问题。我无法使用@SqlResultSetMapping
,因为根据我正在使用的代码的结构,我没有任何要映射的类。我的查询结果必须是列表
结果,而NamedNativeQueries无法做到这一点,因为Hibernate不支持它。请显示您的代码。为什么您不能将其转换为库中的类?这段代码对我有效,我不知道它是否对提出问题的人有用。也许你可以在问题的评论中问它;-)谢谢此代码允许我获取原始表内容