当前位置: 首页 > 面试题库 >

如何从Hibernate Criteria API获取SQL(*不*用于记录)

伊俊能
2023-03-14
问题内容

有没有一种简单的方法可以从hibernate条件中获取(待生成的)SQL?

理想情况下,我会像这样:

Criteria criteria = session.createCriteria(Operator.class);

... build up the criteria ...
... and then do something like ...

String sql = criteria.toSql()

(But this of course does not exist)

然后的想法是将sql用作巨大的“ MINUS”查询的一部分(我需要找到2个相同模式之间的差异-结构相同,而不是数据相同-
并且Hibernate不支持MINUS)

(顺便说一句,我知道我可以从日志文件中检查SQL)


问题答案:

我已经使用Spring
AOP完成了这样的事情,因此我可以获取应用程序中运行的任何查询的sql,参数,错误和执行时间,无论是HQL,Criteria还是本机SQL。

这显然是脆弱,不安全的,可能会因Hibernate中的更改而中断,等等,但它说明可以获取SQL:

CriteriaImpl c = (CriteriaImpl)query;
SessionImpl s = (SessionImpl)c.getSession();
SessionFactoryImplementor factory = (SessionFactoryImplementor)s.getSessionFactory();
String[] implementors = factory.getImplementors( c.getEntityOrClassName() );
CriteriaLoader loader = new CriteriaLoader((OuterJoinLoadable)factory.getEntityPersister(implementors[0]),
    factory, c, implementors[0], s.getEnabledFilters());
Field f = OuterJoinLoader.class.getDeclaredField("sql");
f.setAccessible(true);
String sql = (String)f.get(loader);

尝试将所有物品包装起来并使用,后果自负。



 类似资料:
  • 问题内容: 我有一个表 的学生 这样 我想获取所有记录,但不应重复邮政编码。因此,在上述表记录的情况下,应获取记录1和2。将不会提取第3条记录,因为它的邮政编码已在第1条记录中。 问题答案: 以下查询将仅选择不同的“ zip”字段。 以下查询将选择所有字段以及不同的zip字段。

  • 问题内容: 在日志中,我得到: “来自LAHETYS”发生了什么事?使用HQL或/和SQL处理此问题的最佳实践是什么? 另一个问题: 我得到一个例外: 所以我不能将对象投射到我的Lahetys对象上,很奇怪吗? 谢谢!佐美 问题答案: 您的HQL查询无效。LIMIT不是有效的HQL子句。要在Hibernate中做到这一点,只需

  • 我最近尝试了SQL。有一个查询要求,我必须列出“9.显示所有经理的empno、ename、job、hiredate、exp”。我打字 结果,没有获取任何记录。只显示元数据。 以前,其他查询工作正常。 请帮忙!

  • 我有一张siswa和kelas的联合表格。在kelas表中有一列idSiswa,它来自siswa表的id。问题是当kelas加入时,我如何从他那里获得id。当我尝试获取id时,它显示了来自siswa表的id,而不是来自kelas表的id,我也已经使用了右连接和左连接,但仍然没有得到答案 我使用来自laravel的查询生成器来运行查询,这是我的查询

  • 问题内容: 我正在从事C#项目,并且对这项技术不熟悉。 我想从SQL Server 2008中读取一些数据,并编写以下代码 但是我读过一篇有关SQL注入的文章,并且我想使用SQL参数来避免这种情况,但是我不知道如何做。 问题答案: 这是对代码的简单重做。未经测试,但实质上,它包括在一次性对象周围添加using语句以及使用带有参数集合的SqlCommand 注意命令文本如何不直接包含用户和密码的字符

  • 问题内容: 我有样本数据 我需要获得Run_Amount的MAX(month),即:2020-06-01-> 15000 需要获取当前月份的cal_amt,即:2020-05-01-> 12000和0.00也与本月相关2020-04-01 我需要这样的输出: 它是示例数据,但还有另外几列我尝试使用 MAX()条件 和 谁能建议我最好的方法 问题答案: 使用window函数获取具有最大月份的的行,然