Java JPA规范:选择列表属性包含具有特定值的项的项

Java JPA规范:选择列表属性包含具有特定值的项的项,java,spring-boot,jpa,Java,Spring Boot,Jpa,我试图用JPA规范解决以下问题: 考虑以下类别: public class Language { private String name; ... } public class Person { private List<Language> languages; ... } 公共类语言{ 私有字符串名称; ... } 公共阶层人士{ 私人名单语言; ... } 如何选择所有使用名称为x的语言的人员?我正在寻找一个使用CriteriaBuilder

我试图用JPA规范解决以下问题:

考虑以下类别:

public class Language {
    private String name;
    ...
}

public class Person {
    private List<Language> languages;
    ...
}
公共类语言{
私有字符串名称;
...
}
公共阶层人士{
私人名单语言;
...
}
如何选择所有使用名称为
x
的语言的
人员?我正在寻找一个使用
CriteriaBuilder
的解决方案,它应该生成一个
谓词
,我可以与其他谓词一起“and”


提前谢谢。

其实很简单:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> query = cb.createQuery(Person.class);
Root<Person> root = query.from(Person.class);
ListJoin<Person, Language> langJoin = root.join(Person_.langs);
query.where(cb.equal(langJoin.get(Language_.name), lang));
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(Person.class);
Root=query.from(Person.class);
ListJoin langJoin=root.join(Person.langs);
where(cb.equal(langJoin.get(Language.name),lang));

因此,您基本上通过相应的关联来连接语言,然后添加一个
equals
谓词,将连接实体的必需属性与您的条件相匹配

谢谢,但它不应该是
joinList
而不是
join
joinList
不是类型安全的,因为它依赖于关联的字符串名称。使用
Root.join
并从实体元模型传入属性时,它将根据元模型属性类型自动返回相应的连接类型。在我们的例子中,
Person.\uz.langs
是一个
ListAttribute
,因此产生的连接是
ListJoin
实例-只需查看所有重载的
.join
方法。