首页 > 解决方案 > 如何获取命名查询的 jpql?

问题描述

假设有以下定义:

@Entity
@NamedQueries({
    @NamedQuery(name = "name1", query = "SELECT n FROM SomeEntity n where n.name= :name"),
    @NamedQuery(name = "name2", query = "SELECT n FROM SomeEntity n where n.name <> :name")
})
public class SomeEntity ......

如何以编程方式获取命名查询的定义?

例如下面的代码片段应该打印一个name1查询的定义,我不知道如何在代码中得到这个定义:

String queryString = ????????.getSqlOfNamedQuery("name1");
// the below line should print: SELECT n FROM SomeEntity n where n.name= :name
System.out.println( queryString ); 

标签: javahibernatejpa

解决方案


您可以使用该unwrap方法并为其提供特定于供应商的类。我在一篇旧的 DZone 文章中看到了这一点。我已经测试了 EclipseLink 版本,它对我有用:

Query query = entityManager.createQuery("....");

对于 EclipseLink:

String sqlString = query.unwrap(JpaQuery.class).getDatabaseQuery().getSQLString();

对于休眠:

String sqlString = query.unwrap(org.hibernate.Query.class).getQueryString();

您还可以检查您的数据库日志(即/var/log/postgres/postgres.log),但您可能有其他需要编程方法的要求。


推荐阅读