gpt4 book ai didi

java - HQL/SQL/Criteria 在选择所有字段时加入匹配给定列表中的所有记录

转载 作者:行者123 更新时间:2023-11-29 09:18:09 24 4
gpt4 key购买 nike

我正在尝试编写一个 HQL/Criteria/Native SQL 查询,它将返回分配给项目列表的所有员工。他们必须分配给所有项目才能被选中。

可以在这个问题的答案中找到使用 native SQL 实现此目的的可接受方法:T-SQL - How to write query to get records that match ALL records in a many to many join :

SELECT e.id 
FROM employee e
INNER JOIN proj_assignment a
ON e.id = a.emp_id and a.proj_id IN ([list of project ids])
GROUP BY e.id
HAVING COUNT(*) = [size of list of project ids]

但是,我想选择 Employee ( e.* ) 的所有字段。无法定义 SQL grouping by all the columns ( GROUP BY e.* ), DISTINCT应该改用。有没有办法使用 DISTINCTCOUNT(*)一起实现我想要的?

我也尝试过使用 HQL 来执行此查询。 EmployeeProjectAssignment类没有关联,因此无法使用 Criteria 来加入它们。我使用交叉连接,因为它是执行 Join without association in HQL 的方式.所以,我的 HQL 看起来像

select emp from Employee emp, ProjectAssignment pa 
where emp.id = pa.empId and pa.paId IN :list
group by emp having count(*) = :listSize

但是,由于 Hibernate 中的错误,GROUP BY entity does not work .它输出的 SQL 类似于 group by (emptable.id) .

子查询每个项目的分配表(为列表中的每个项目动态添加 and exists (select 1 from proj_assignment pa where pa.emp_id=e.id and pa.proj_id = [anId]))不是可接受的选项。

有没有办法正确地编写此查询,最好是在 HQL 中(最后我想要一个 List<Employee>),而无需修改映射,也无需显式选择 native SQL 中的所有列?


编辑:我正在使用 Oracle 10g 和 hibernate-annotations-3.3.1.GA

最佳答案

怎么样:

select * from employee x where x.id in(
SELECT e.id
FROM employee e
INNER JOIN proj_assignment a
ON e.id = a.emp_id and a.proj_id IN ([list of project ids])
GROUP BY e.id
HAVING COUNT(*) = [size of list of project ids]
)

关于java - HQL/SQL/Criteria 在选择所有字段时加入匹配给定列表中的所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8171070/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com