假设存在以下定义:
@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 );
最佳答案
您可以使用unwrap
方法,并为其提供供应商特定的类。我在old DZone article中看到了这一点。我已经测试了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
),但可能还有其他要求,需要采用编程方法。