【问题标题】:Does JPQL have a "SUBSET" functionJPQL 是否有“SUBSET”功能
【发布时间】:2013-08-14 12:05:35
【问题描述】:

我有一个简单的数据模型如下:

  • 实体 1:员工资产。这有一个对 Employee 对象的引用。
  • 实体 2:EmployeeJobPosition。这也有对 Employee 的引用。它还引用了一个 JobPosition(这是另一个实体类)对象,该对象又包含一个 OrganisationUnitEntry(这是另一个实体类)对象的集合。

作为一个参数,我有一个用户选择的 OrganisationUnitEntry 对象的集合(我们称之为 ouEntries)。我需要一个查询,该查询将返回与 JobPosition 相关的所有 EmployeeAsset 对象,该 JobPosition 上有一个 OrganisationUnitEntry 集合,该集合是 ouEntries 的超集(即 ouEntries 是 ...jobPosition.organisationUnitEntries 的子集)。

因此可以使用以下内容动态构建查询:

SELECT ea
FROM EmployeeAsset ea, EmployeeJobPosition ejp
WHERE ea.employee = ejp.employee
AND :orgUnitEntry1 MEMBER OF ejp.jobPosition.organisationUnitEntries
...
AND :orgUnitEntryN MEMBER OF ejp.jobPosition.organisationUnitEntries

(其中 orgUnitEntry1 - N 只是 ouEntries 中的元素)。

但是,子集类型函数会更整洁,然后我可以将其放入我通常更喜欢的静态/命名查询中。类似的东西

...
AND :ouEntries SUBSET OF ejp.jobPosition.organisationUnitEntries

关于如何最好地编写这样的查询有什么想法吗?

【问题讨论】:

  • JPA 规范是怎么说的?
  • 我找不到任何关于 SUBSET 函数的信息,这就是我要问的原因:) 它也可能不仅仅是一个函数,我只是在寻找一种替代/更好的方法来生成我在示例中以静态方式给出的动态查询

标签: java jpa jpql


【解决方案1】:

你可以使用 IN 吗?

SELECT ea
FROM EmployeeAsset ea, EmployeeJobPosition ejp join ejp.jobPosition.organisationUnitEntries o
WHERE ea.employee = ejp.employee
AND o IN :ouEntries

根据您的 JPA 提供商,您可能需要将 id 与 IN 进行比较,而不是对象。 EclipseLink 应该允许您比较对象 (>=2.4)。

【讨论】:

  • 感谢詹姆斯的建议。我可以试试这个。它肯定只需要更改为“AND :ouEntries IN o”,因为我想检查 ouEntries 是否是 ejp.jobPosition.organisationUnitEntry 的子集?仅供参考:我使用最新版本的 Hibernate,所以我将不得不看看它是如何处理这个问题的。再次感谢。
猜你喜欢
  • 2023-03-31
  • 2016-08-13
  • 2010-09-07
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多