从列表或两个不同实体动态查询

时间:2019-01-02 13:55:35

标签: java spring-boot jpa hibernate-criteria criteria-api

在基本元数据中,然后在标签和语言中,我有一个名为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);
    };

1 个答案:

答案 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));