在基本元数据中,然后在标签和语言中,我有一个名为Person的实体。我想获取包含特定标签名称和语言的所有行。 我是来了解有关条件查询的。我们如何将两个不同的实体互连在一起?
示例:获取所有标记为Model且语言为English的行。
@Entity
public Person {
@Id
private String id;
private BasicMetadata basicMetadata;
-----------
}
基本元数据表
@Entity
public BasicMetadata {
@Id
private String id;
private List<Tag> tags;
private List<Language> language;
-------------
}
标签表
@Entity
public Tag {
@Id
private String id;
private String name;
-------------
}
语言表
@Entity
public Language{
@Id
private String id;
private String name;
-------------
}
我为规格查询创建了一个简单的方法,就是正确的
private Specification<Person> containsText(String keyword) {
return (root,query, builder) -> {
String finalText = keyword.toLowerCase();
if (!finalText.contains("%")) {
finalText = "%" + finalText + "%";
}
Predicate genreExp = builder.like(builder.lower(root.get("basicMetadata").get("tags")), finalText);
return builder.or(genreExp);
};
答案 0 :(得分:0)
您可以这样编写规范
public class PersonSpecifications {
public static Specification<Person> hasTag(String keyword) {
return (root, query, builder) -> {
String finalText = keyword.toLowerCase();
if (!finalText.contains("%")) {
finalText = "%" + finalText + "%";
}
Join<Person, BasicMetaData> md = root.join("basicMetaData");
return builder.like(builder.lower(md.join("tags").get("name")), finalText);
}
}
}
,您可以使用此规范来获取过滤后的结果
repository.findAll(PersonSpecifications. hasTag("abc"),PageRequest,of(0,10));