Java Hibernate-如何在不映射到特定类的情况下执行命名本机查询

Java Hibernate-如何在不映射到特定类的情况下执行命名本机查询,java,sql,hibernate,Java,Sql,Hibernate,我有一个非常复杂的查询,不能转换为HQL,所以我必须使用SQL。我将查询放入NamedNativeQuery注释中。它“应该”返回两个值的列表(list)。当我尝试运行时,会话无法加载查询,因为我没有定义映射或结果类。我无法创建一个简单的类来映射这些值,因为注释必须放在特定的DAO项目中,并且使用查询的代码存在于它自己的项目中。(DAO项目更通用,该项目中的实体直接映射到数据库中的表。我不能在此项目中创建一个小类来映射到我的查询结果,因为它不适合此项目的架构) 是否有一种方法可以将查询结果映射到

我有一个非常复杂的查询,不能转换为HQL,所以我必须使用SQL。我将查询放入NamedNativeQuery注释中。它“应该”返回两个值的列表(
list
)。当我尝试运行时,会话无法加载查询,因为我没有定义映射或结果类。我无法创建一个简单的类来映射这些值,因为注释必须放在特定的DAO项目中,并且使用查询的代码存在于它自己的项目中。(DAO项目更通用,该项目中的实体直接映射到数据库中的表。我不能在此项目中创建一个小类来映射到我的查询结果,因为它不适合此项目的架构)


是否有一种方法可以将查询结果映射到更通用的类,或者更好,是否有一种方法可以让我只获取
列表
,而不必映射到任何特定的类?当我只想执行一个查询并将结果作为数组返回时,Hibernate必须以这种特殊的方式工作,这非常令人沮丧。

a
NamedNativeRequesty
支持添加注释,以允许您将结果映射到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不支持它。

请显示您的代码。为什么您不能将其转换为库中的类?这段代码对我有效,我不知道它是否对提出问题的人有用。也许你可以在问题的评论中问它;-)谢谢此代码允许我获取原始表内容