Динамический запрос из списка или двух разных объектов - PullRequest
0 голосов
/ 02 января 2019

У меня есть сущность с именем Person, внутри этих основных метаданных, а затем внутри этого тега и языка. Я хочу получить все строки, которые содержат конкретные имя тега и язык. Я узнал о критериях запроса о. Как мы можем связать две разные сущности вместе?

Пример: получить все строки, имеющие тег «Модель» и язык как «Английский».

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

}

Я создал простой метод для спецификации Query, это правильно

 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 голосов
/ 02 января 2019

вы можете написать свою спецификацию следующим образом:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...