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

时间:2014-07-30 23:41:41

标签: java sql hibernate

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

我有没有办法将查询结果映射到一个更通用的类,或者更好的是我有一些方法可以让List<Object[]>返回而不必映射任何特定的东西?当我想要做的就是执行查询并将结果作为数组返回时,Hibernate必须以这种特殊方式工作,这是非常令人沮丧的。

3 个答案:

答案 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不支持它。