【问题标题】:Convert SQL query to HQL or map result to hibernate entity将 SQL 查询转换为 HQL 或将结果映射到休眠实体
【发布时间】:2016-04-26 09:49:57
【问题描述】:

我有下面的 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 中的实体类。

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    您可以尝试通过在查询语句中添加一些别名来将您的 sql 查询转换为休眠查询

    在这里查看: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();
    

    希望对你有帮助。

    【讨论】:

    • 我已经尝试过了,但是我的查询包含休眠中不支持的 SQL 函数。你知道如何在hibernate中使用over partition by函数吗?
    • 您是否尝试在数据库上运行此查询?结果是什么?你确定这些列在你的 hbm 文件中定义正确吗?!
    • 我正在使用基于注释的实体声明。并且查询是 SQL 查询而不是 HQL,并且它在数据库端运行没有错误。
    • 太棒了!!你节省了我的时间。
    猜你喜欢
    • 2017-05-13
    • 2016-06-21
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2020-12-08
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多