【问题标题】:Dynamically Query from List or two different entities从列表或两个不同实体中动态查询
【发布时间】:2019-05-29 04:13:03
【问题描述】:

我有一个名为 Person 的实体,在基本元数据中,然后在标签和语言中。我想获取包含特定标签名称和语言的所有行。 我开始了解有关 Criteria Query 的信息。我们如何将两个不同的实体连接在一起?

示例:获取标签为 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);
    };

【问题讨论】:

    标签: java spring-boot jpa criteria-api


    【解决方案1】:

    你可以这样写你的规范

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

    【讨论】:

    • 但是在将 Person 存储库用作 Page&lt;Person&gt; findAll(Specification&lt;Person&gt; containsText, Pageable pageRequest); 时。运行应用程序后出现Caused by: org.springframework.data.mapping.PropertyReferenceException: No property findAll found for type Person! 错误
    • 您的存储库是否扩展了 JpaSpecificationExecutor?
    • 是的,同时扩展PagingAndSortingRepository&lt;Person, String&gt;JpaSpecificationExecutor&lt;Person&gt;
    • 这似乎不对。您可以分享您的存储库代码以及导致异常的代码吗?
    • public interface PersonRepository extends CrudRepository&lt;Person, String&gt;, JpaSpecificationExecutor&lt;Person&gt; { Page&lt;Person&gt; findAll(Specification&lt;Person&gt; containsText, Pageable pageRequest); Page&lt;Person&gt; findAll(Pageable pageable); }
    猜你喜欢
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多