che*_*vim 10 sql hibernate hql distinct
我有这个测试HQL:
select distinct o from Order o left join fetch o.lineItems
Run Code Online (Sandbox Code Playgroud)
并且它确实生成了一个SQL别而没有明显的原因:
select distinct order0_.id as id61_0_, orderline1_.order_id as order1_62_1_...
Run Code Online (Sandbox Code Playgroud)
SQL结果集总是相同的(有和没有SQL不同):
order id | order name | orderline id | orderline name
---------+------------+--------------+---------------
1 | foo | 1 | foo item
1 | foo | 2 | bar item
1 | foo | 3 | test item
2 | empty | NULL | NULL
3 | bar | 4 | qwerty item
3 | bar | 5 | asdfgh item
Run Code Online (Sandbox Code Playgroud)
为什么hibernate生成SQL不同?SQL distinct没有任何意义,使得查询比需要的慢.这与常见问题解答相反,后者提到在这种情况下hql distinct只是结果转换器的快捷方式:
session.createQuery("从Order o left join oetch o.lineItems中选择distinct o").list();
看起来您在这里使用SQL DISTINCT关键字.当然,这不是SQL,这是HQL.在这种情况下,这个不同只是结果转换器的快捷方式.是的,在其他情况下,HQL distinct将直接转换为SQL DISTINCT.不是在这种情况下:您无法在SQL级别过滤掉重复项,产品/连接的本质禁止这样做 - 您需要重复项或者您没有获得所需的所有数据.
谢谢
仔细看看 hibernate 生成的 sql 语句 - 是的,它确实使用了“distinct”关键字,但不是以我认为您期望的方式(或 Hibernate FAQ 暗示的方式)即返回一组“不同的”或“独特的”订单。
它不使用 unique 关键字返回不同的订单,因为考虑到您还指定了联接,这在该 SQL 查询中没有意义。
生成的 sql 集仍然需要由 ResultTransformer 处理,因为显然 sql 集包含重复的订单。这就是为什么他们说 HQL 不同关键字不直接映射到 SQL 不同关键字。
| 归档时间: |
|
| 查看次数: |
8721 次 |
| 最近记录: |