我可以知道如何从JPA查询获取sql吗?或者说,将JPA查询转换为SQL字符串?非常感谢你!我可以从JPA查询对象获取SQL字符串吗?
回答
如果你只是想知道你的JPQL或条件查询如何被翻译成你的数据库的SQL方言,你可以启用持久性XML细粒度的日志记录,然后看看你的日志文件。
属性名称和值取决于您的JPA实现。这里是的persistence.xml为EclipseLink的相关部分的一个例子:
<properties>
<property name="eclipselink.logging.level" value="FINEST"/>
</properties>
您可能感兴趣的是,如果有一种方法可以从javax.persistence.Query中提取JPQL字符串(包含params的占位符或params填充后的最终JPQL)(可能的子类之一是更精确), - 在这种情况下根据JPA规范合同是不可能的。然而,假设这可能是通过JPA实现的(例如,NamedQueryImpl可能具有#toJPQLString(),您可以通过投射来访问它),但是我对此抱有怀疑。 即使有可能我不认为这是一个很好的代码来执行这样的操作。我会建议找到另一个设计解决方案(并且你可以指定你有什么样的实际问题)。例如,如果您要动态构建查询,则可以使用JPA Criteria API,并且可以使用“构建”JPA查询来维护反映查询逻辑的内部数据结构。
除了能够像@马特方便的日志中提到,也可以得到与在运行时的EclipseLink特定查询的SQL字符串如here所述。
使用Hibernate作为供应商,您可以启用以下属性:
hibernate.show_sql
所有SQL语句到控制台。这是设置日志类别org.hibernate.SQL进行调试的替代方法。 (例如true | false)
hibernate.format_sql
漂亮地打印日志和控制台中的SQL。 (例如:true |假)
或者,你上面的说明可以启用日志记录到调试级别为记录器
org.hibernate.SQL
日志中的所有SQL DML语句执行时为它们
对于的EclipseLink:您可以提取SQL方式如下:
query.unwrap(EJBQueryImpl.class).getDatabaseQuery().getSQLString()
仅当在之后查询已执行。
为我工作,但我的项目没有EJBQueryImpl.class(我用String rtn = query.unwrap(org.hibernate.Query.class).getQueryString();) – John 2016-10-26 14:22:39
继卡罗尔的答案 - 这是可能的EclipseLink的执行语句之前检索SQL:
Session session = em.unwrap(JpaEntityManager.class).getActiveSession();
DatabaseQuery databaseQuery = query.unwrap(EJBQueryImpl.class).getDatabaseQuery();
databaseQuery.prepareCall(session, new DatabaseRecord());
Record r = databaseQuery.getTranslationRow();
String bound = databaseQuery.getTranslatedSQLString(session, r);
String sqlString = databaseQuery.getSQLString();
要检索的SQL字符串在/执行后,它可能是最好的,而不是这样做的使用持久性代码:
<property name="eclipselink.logging.parameters" value="true"/>
<property name="eclipselink.logging.level" value="FINE"/>
- 1. 我可以从sqlite查询字符串中获取表名吗?
- 2. 如何从solr查询字符串中获取查询对象
- 3. 我可以使用String.format构建Sql查询字符串吗
- 4. 我可以从LINQ对象内执行LINQ to SQL查询吗?
- 5. 我可以从字符串表达式运行LINQ查询吗?
- 6. MySQL查询字符串SQL对象
- 7. 从查询字符串获取Json对象c#
- 8. ASP.NET MVC - 从查询字符串获取对象列表
- 9. 我可以从Dapper查询获取字段结构吗?
- 10. 是否可以从XPathExpression获取XPATH查询字符串?
- 11. 从可能相对的URL获取查询字符串
- 12. 我可以从对象获取固定对象的GCHandles吗?
- 13. 我可以在JPA本机SQL查询中检索列名吗?
- 14. 从Javascript获取查询字符串值
- 15. 从查询字符串获取变量
- 16. 从查询字符串获取数据
- 17. 从URLReferrer获取查询字符串
- 18. 从字符串获取对象值
- 19. 从对象获取字符串
- 20. 从对象中获取字符串
- 21. 从字符串获取NSDate对象
- 22. 我可以使用ExpressJS遍历查询字符串参数吗?
- 23. 我可以使用子查询连接字符串吗?
- 24. 我可以使用RewriteRule重定向到查询字符串吗?
- 25. 是否有可能从查询字符串中获取字典?
- 26. 如何获取ID列表的所有JPA对象,或者如何从此SQL查询中创建JPA查询?
- 27. 如何通过查询字符串获取JSON对象
- 28. 从RouteValueDictionary对象创建一个字符串/查询字符串对象
- 29. Javascript - 从字符串中获取查询字符串?
- 30. JPA:我可以使用@Column(precision =)作为字符串值吗?
你能更清楚地了解你想要的东西吗?即请发布“JPA查询”(标准查询?JPQL?),并且可能是您期望的输出类型的示例。另请告诉我们,您使用的JPA实现(OpenJPA,Hibernate等) – 2011-06-08 09:23:32
对于hibernate实现:query.unwrap(org.hibernate.Query.class).getQueryString()。 – 2017-09-13 06:10:13