【问题标题】:How to work with lists in JPA Specifications如何使用 JPA 规范中的列表
【发布时间】:2021-11-12 11:06:48
【问题描述】:

我一直在尝试使用 JPA 规范,但我不知道如何转换此查询:

select employees.* from employees
left join qualification_assignments on employees.qualification_profile_id =qualification_assignments.qualificationProfile_id
where qualification_id in <some list of strings>

我已经能够转换只包含琐碎谓词的简单查询。但是,似乎没有任何更高级用例的文档。如果有人能指出我正确的方向,我将不胜感激。

我的尝试看起来像这样,导致各种异常:

Join<Employee, QualificationProfile> assignmentJoin = root.join("qualificationProfile");

return criteriaQuery.where(criteriaBuilder.in(assignmentJoin.get("qualificationAssignments"))
           .in(searchCriteria.getQualificationIds())).getGroupRestriction();

以下内容对我来说最有意义,但连接不起作用。

Join<Employee, QualificationAssignment> assignmentJoin = root.join("qualificationProfile");

return criteriaQuery.where(criteriaBuilder.in(assignmentJoin.get("qualificationId"))
           .in(searchCriteria.getQualificationIds())).getGroupRestriction();

数据模型如下所示:

【问题讨论】:

  • 我们更喜欢 QueryDsl。使用该工具,您可以流畅而简单地编写查询。
  • 你可以在persistence.xml中设置,然后你看看查询是什么。请分享它和你的愿望 sql。
  • @LászlóTóth 我无法为您提供输出,因为我无法编写不会导致异常的查询。问题中提供了我的愿望 sql。我只需要 JPA 规范 API 中的表示
  • 我想,把记录的纯sql语句发给我,jpa生成什么。

标签: mysql sql jpa join specifications


【解决方案1】:

https://www.logicbig.com/tutorials/java-ee-tutorial/jpa/criteria-api-left-join-on-condition.html

也许有帮助。你可以生成像Employee_这样的元类。

Root<Employee> employee = query.from(Employee.class);
ListJoin<Employee, QualificationProfile> profiles = employee.join(Employee_.qualificationProfile, JoinType.LEFT);
profiles.on(criteriaBuilder.in(profiles.get(QualificationProfile_.qualificationAssignments), searchCriteria.getQualificationIds()));

【讨论】:

    【解决方案2】:

    感谢 Lazlo Toth 的帮助,我走上了正轨。非常感谢。

    最终的规范如下所示:

    Join<Employee, QualificationAssignment> profiles = root
                    .join("qualificationProfile", JoinType.LEFT)
                    .join("qualificationAssignments");
            
    profiles.on(profiles.get("qualification").get("id")
                    .in(new HashSet<>(searchCriteria.getQualificationIds())));
    
    return profiles.isNotNull();
    

    既然我有一个有效的解决方案,我将仔细研究元类。我发现https://www.logicbig.com/tutorials/java-ee-tutorial/jpa/criteria-api-in-predicate.html 很有帮助。

    【讨论】:

    • 不客气。如果您使用元类而不是字符串,那就更好了。如果表的列发生更改,您必须搜索所有字符串。如果你使用元数据,那么这个 bug 就是用来构建的。
    猜你喜欢
    • 2019-11-18
    • 2023-03-24
    • 2020-01-14
    • 2022-01-20
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    相关资源
    最近更新 更多