将SQL查询转换为HQL或将结果映射到hibernate实体

时间:2016-04-26 09:49:57

标签: java hibernate hql hibernate-criteria

我有以下SQL查询

select column1 ,column2 ,column3 ,column4 ,column5 ,column6 from (
select ROW_NUMBER() OVER (PARTITION BY column2 ORDER BY null desc) rn,column1,  
column2 ,column3 ,column4 ,column5 ,column6
from TBLCUSTOMERSUBMODULERELATION where column1 = 'somevalue' AND column3 ='somevalue')
where rn=1;  

我想将此查询转换为HQL 在我的代码中column1,column2,column3EmbeddedId 我试图使用下面的代码

直接在我的类对象中转换或映射此结果
session = sessionFactory.openSession();
SQLQuery sqlQuery = session.createSQLQuery(qry);
sqlQuery.addEntity(CustomerSubModuleRelationBean.class);

但它会出现Caused by: java.sql.SQLException: Invalid column name

之类的错误

有没有人知道如何使用将本机SQL转换为HQL或将我的结果直接映射到Hibernate中的实体类。

1 个答案:

答案 0 :(得分:0)

您可以尝试将sql查询转换为hibernate查询,并在查询语句中添加一些别名

点击此处:Query conversion - Sql to Hql

您正在使用本机SQL查询。

如果您使用的是JPA,则语法为:

Query q = em.createNativeQuery("select foo.* FROM Foo foo " +
                               "where f.x = max(f.x) over " +
                               "(partition by f.y)", Foo.class);

如果您需要返回多种类型,请查看SQLResultSetMapping注释。

如果您直接使用Hibernate API:

Query q = session.createSQLQuery("select {foo.*} from Foo foo " +
                                 "where f.x = max(f.x) over "+
                                 "(partition by f.y)");
q.addEntity("foo", Foo.class);

有关详细信息,请参阅Hibernate文档中的10.4.4. Queries in native SQL

在这两个API中,您可以使用setParameter正常传递参数。

使用这种方式初始化sessionFactory而不是openSession方法。

SessionFactory factory = new AnnotationConfiguration()
                             .configure()
                           //.addPackage("com.xyz") //add package if used.
                             .addAnnotatedClass(Employee.class)
                             .buildSessionFactory();

我希望这会对你有所帮助。