gpt4 book ai didi

java - 构建 CriteriaBuilder 查询来比较列表

转载 作者:行者123 更新时间:2023-12-01 19:02:40 25 4
gpt4 key购买 nike

如何比较数据库表中的列表和程序代码中的列表?
该数据库包含具有技能的用户配置文件。

    @ManyToMany(cascade = {CascadeType.MERGE}, fetch = FetchType.EAGER)
@JoinTable(name = "profile_skills",
joinColumns = @JoinColumn(name = "profile_id", referencedColumnName="id"),
inverseJoinColumns = @JoinColumn(name = "skill_id", referencedColumnName="id"))
private Map<Integer, Skill> skills = new TreeMap<>();

需要找到具有合适技能的用户个人资料。
我提出了请求,但他选择的个人资料至少与列表中的任何技能有一项匹配。但是,我只需要选择那些具有列表中指示的所有技能的技能(与列表中的所有元素匹配)。

    CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Profile> cq = cb.createQuery(Profile.class);
Root<Profile> root = cq.from(Profile.class);
MapJoin<Profile, Integer, Skill> skillMapJoin = root.join(Profile_.skills);
Expression<String> nameSkill = skillMapJoin.get(Skill_.name);

List<String> skills = Arrays.asList("Java", "JavaScript");

cq.where(nameSkill.in(skills)).groupBy(root.get(Profile_.id));

TypedQuery<Profile> q = em.createQuery(cq);
List<Profile> profiles = q.getResultList();

例如:
Profile1.技能:“Java”、“Scala”、“Groovy”、“JavaScript”
Profile2.技能:“Java”、“Scala”、“Groovy”
Profile3.技能:“Groovy”、“JavaScript”

我的查询返回结果:Profile1、Profile2、Profile3
必须有一个结果:Profile1

请告诉我如何实现我需要的请求?
如何比较数据库表中的列表和程序代码中的列表?
不仅可以使用 CriteriaBuilder,还可以使用其他查询选项,如 sql 或 jpql。

最佳答案

我找到了一个解决方案,尽管我认为可以采取不同的方式。

    CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Profile> cq = cb.createQuery(Profile.class);
Root<Profile> root = cq.from(Profile.class);
MapJoin<Profile, Integer, Skill> skillMapJoin = root.join(Profile_.skills);
Expression<String> nameSkill = skillMapJoin.get(Skill_.name);

List<String> skills = Arrays.asList("Java", "JavaScript");
Integer sizeListValue = skills.size();
Expression<Long> countSkills = cb.count(exp);

cq.where(nameSkill.in(skills))
.groupBy(root.get(Profile_.id))
.having(cb.equal(countSkills, sizeListValue));

TypedQuery<Profile> q = em.createQuery(cq);
List<Profile> profiles = q.getResultList();

关于java - 构建 CriteriaBuilder 查询来比较列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59608880/

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