java - 如何获取命名查询的 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 );
解决方案
您可以使用该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
),但您可能有其他需要编程方法的要求。
推荐阅读
- sql - 为什么 SQL Server 不允许我将 '21/04/17' 存储为日期?
- python - 仅当某个字段为 True 时,如何才能渲染视图?- 姜戈
- c# - WPF - 按钮上下文菜单未正确显示
- java - Spring Security JDBC认证登录用户错误
- python - 查找列表中多个集合之间的交集
- github - Github Actions CI:未在推送功能分支时运行
- r - Pivot_wider 介绍了 NA
- java - 自定义对象的自定义排序
- php - 如何遍历所有资产并检查密钥,如果密钥匹配,则继续并显示所有资产?PHP/Laravel
- php - php mysql foreach 重复两次