Spring Data JPA: генерировать динамический запрос - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть объект, который содержит некоторые логические данные:

@Entity
public class Person {
  private Long id.
  private String name;
  private int age;
  private String address;
  ...
}

Я создаю свой интерфейс данных Spring

@Repository
public interface CardInventoryRepository extends JpaRepository<Person , Long> {
}

Моя цель, например, создать динамический запрос на основе существующих значений моего объекта. если имя пустое, запрос:

select * from Person p  Where p.age=12 AND p.address="adress.."

Когда адрес нулевой, запрос должен быть:

select * from Person p  Where p.age=12 AND p.name="ALI"

Я хочу извлечь данные, используя только непустые поля?

Есть ли какое-либо решение, использующее данные пружины для построения динамических запросов? Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

На основании документа Spring https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example

Query by Example (QBE) - это удобный метод запросов с простой интерфейс Это позволяет динамическое создание запроса и не требует от вас писать запросы, которые содержат имена полей. На самом деле, Query Примером не требуется писать запросы с помощью все специфичные для магазина языки запросов.

Определение: Пример берет объект данных (обычно объект сущности или его подтип) и спецификацию, как сопоставлять свойства. Вы можете использовать Query by Example с JPA Хранилища.

Для этого расширьте интерфейс вашего хранилища QueryByExampleExecutor<T>, например:

public interface PersonRepository extends CrudRepository<Person, String>, QueryByExampleExecutor<Person> {
}

Вот доступные методы в QueryByExampleExecutor:

public interface QueryByExampleExecutor<T> {

  <S extends T> S findOne(Example<S> example);

  <S extends T> Iterable<S> findAll(Example<S> example);

  // … more functionality omitted.
}

USAGES:

Example<Person> example = Example.of(new Person("Jon", "Snow"));
repo.findAll(example);


ExampleMatcher matcher = ExampleMatcher.matching().
    .withMatcher("firstname", endsWith())
    .withMatcher("lastname", startsWith().ignoreCase());

Example<Person> example = Example.of(new Person("Jon", "Snow"), matcher); 
repo.count(example);

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

0 голосов
/ 16 сентября 2018

Да, обратите внимание на поддержку QueryDSL для Spring Data. Ваш вариант использования может быть реализован через предикат. Короче говоря, вы должны создать предикат, в котором вы будете передавать непустые поля, а затем передавать этот предикат в метод findAll, который принимает Predicate в качестве аргумента. Ваш интерфейс репозитория также должен расширять QueryDslPredicateExecutor

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...