【发布时间】:2020-06-18 23:40:42
【问题描述】:
我正在开发一个利用休眠连接到 DB2 数据库的 Spring Web 应用程序。我正在尝试通过减少数据库查询的数量来优化在周三服务调用期间可能会被调用的服务方法。
所以我的问题是这个查询是否
SELECT DISTINCT a.* FROM TABLE_A a
LEFT JOIN TABLE_B b ON a.ID = b.FK_ID
LEFT JOIN TABLE_C c ON a.ID = c.FK_ID
LEFT JOIN TABLE_D d ON c.DATA_RQST_ID = d.ID
WHERE (b.REQUEST_ID = 1234 AND b.TYPE = 'TYPE_A')
OR (c.REQUEST_ID = 1234 AND (c.TYPE = 'TYPE_A' OR c.TYPE = 'TYPE_B'))
相当于/比这个查询更好
SELECT * FROM TABLE_A a
WHERE a.ID IN
(
SELECT b.FK_ID FROM TABLE_B b
WHERE b.REQUEST_ID = 1234 AND eb.TYPE = 'TYPE_A'
)
OR a.ID IN
(
SELECT c.FK_ID FROM TABLE_C
WHERE ( c.REQUEST_ID = 1234 AND c.TYPE = 'TYPE_A' )
OR
(
c.TYPE = 'TYPE_B' AND c.REQUEST_ID IN
(
SELECT d.ID FROM TABLE_D d
WHERE d.REQUEST_ID = 1234 AND v.TYPE = 'TYPE_A'
)
)
)
还是有更好的选择?
两个查询似乎在同一时间(
这两个查询的目的是让其中一个查询替换其他三个查询,其中它们的结果数据在 Java 中处理以获得所需的数据。
我还必须能够将 SQL 查询转换为 HQL。我正在努力转换第一个查询。
我有一种感觉,我可能会浪费我的时间,因为表 B 和 C 的 java 对象在表 A 的对象中是一对多的关系,无论如何它们都是由休眠加载的。这意味着从长远来看,我可能不会随时储蓄。我这里的想法对吗?
谢谢!
【问题讨论】:
-
有一个很大的不同 - 在您的第一个查询中,引用
D不是必需的(它是LEFT JOIN-ed),而在第二个查询中它是必需的.考虑到第二个查询的读取方式,您似乎在第一个查询中遗漏了部分条件。是这样吗? -
@Clockwork-Muse 是的,就是这样。我在逻辑上犯了一个错误,但我认为我应该离开它,因为接受的答案使用了那个逻辑。
标签: java sql spring hibernate db2