Весовые данные JPA-запрос с параметрическими свойствами

Каков самый простой способ объявления запроса данных Spring Spring, который использует свойства входного параметра в качестве параметров запроса?

Например, предположим, что у меня есть class сущностей:

public class Person { @Id private long id; @Column private String forename; @Column private String surname; } 

и другой class:

 public class Name { private String forename; private String surname; [constructor and getters] } 

… тогда я хотел бы написать repository данных Spring следующим образом:

 public interface PersonRepository extends CrudRepository { @Query("select p from Person p where p.forename = ?1.forename and p.surname = ?1.surname") findByName(Name name); } 

… но данные Spring / JPA не любят меня указывать имена свойств в параметре ?1 .

Какая самая опрятная альтернатива? }

Эта ссылка поможет вам: Spring Data JPA M1 с поддержкой выражений SpEL. Аналогичным примером будет:

 @Query("select u from User u where u.firstname = :#{#customer.firstname}") List findUsersByCustomersFirstname(@Param("customer") Customer customer); 

https://spring.io/blog/2014/07/15/spel-support-in-spring-data-jpa-query-definitions

Определите метод запроса с сигнатурами следующим образом.

 @Query(select p from Person p where p.forename = :forename and p.surname = :surname) User findByForenameAndSurname(@Param("surname") String lastname, @Param("forename") String firstname); } 

Для получения дополнительной информации см. Ссылку Spring Data JPA

То, что вы хотите, невозможно. Вы должны создать два параметра и связать их отдельно:

 select p from Person p where p.forename = :forename and p.surname = :surname ... query.setParameter("forename", name.getForename()); query.setParameter("surname", name.getSurname()); 

Вы можете попробовать что-то вроде этого:

 public interface PersonRepository extends CrudRepository { @Query("select p from Person AS p" + " ,Name AS n" + " where p.forename = n.forename " + " and p.surname = n.surname" + " and n = :name") SetfindByName(@Param("name") Name name); } 

Вы тоже работаете с @Service ? Потому что, если вы, то вы можете @Autowired ваш PersonRepository для @Service а затем в службе просто вызвать class Name и использовать форму, которую @CuriosMind … предложил:

 @Query(select p from Person p where p.forename = :forename and p.surname = :surname) User findByForenameAndSurname(@Param("surname") String lastname, @Param("forename") String firstname); } 

и при вызове метода из репозитория в службе вы можете передать эти параметры.

Вы также можете решить его с помощью метода по умолчанию для интерфейса:

  @Query(select p from Person p where p.forename = :forename and p.surname = :surname) User findByForenameAndSurname(@Param("surname") String lastname, @Param("forename") String firstname); default User findByName(Name name) { return findByForenameAndSurname(name.getLastname(), name.getFirstname()); } 

Конечно, у вас все еще будет реальная функция репозитория …

если мы используем JpaRepository, тогда он будет внутренне создавать запросы.

Образец

findByLastnameAndFirstname (имя строки, имя строки)

findByLastnameOrFirstname (имя строки, имя строки)

findByStartDateBetween (Дата date1, Дата2)

findById (int id)

Заметка

если нам нужны сложные запросы, тогда нам нужно написать ручные запросы, например

 @Query("SELECT salesOrder FROM SalesOrder salesOrder WHERE salesOrder.clientId=:clientId AND salesOrder.driver_username=:driver_username AND salesOrder.date>=:fdate AND salesOrder.date<=:tdate ") @Transactional(readOnly=true) List findAllSalesByDriver(@Param("clientId")Integer clientId, @Param("driver_username")String driver_username, @Param("fdate") Date fDate, @Param("tdate") Date tdate); для @Query("SELECT salesOrder FROM SalesOrder salesOrder WHERE salesOrder.clientId=:clientId AND salesOrder.driver_username=:driver_username AND salesOrder.date>=:fdate AND salesOrder.date<=:tdate ") @Transactional(readOnly=true) List findAllSalesByDriver(@Param("clientId")Integer clientId, @Param("driver_username")String driver_username, @Param("fdate") Date fDate, @Param("tdate") Date tdate); 
  for using this, you can create a Repository for example this one: Member findByEmail(String email); List findByDate(Date date); // custom query example and return a member @Query("select m from Member m where m.username = :username and m.password=:password") Member findByUsernameAndPassword(@Param("username") String username, @Param("password") String password); 
 @Autowired private EntityManager entityManager; @RequestMapping("/authors/{fname}/{lname}") public List actionAutherMulti(@PathVariable("fname") String fname, @PathVariable("lname") String lname) { return entityManager.createQuery("select A from Auther A WHERE A.firstName = ?1 AND A.lastName=?2") .setParameter(1, fname) .setParameter(2, lname) .getResultList(); } 
  • обновление логического значения в данных весны jpa с использованием @Query, с гибернацией
  • Использование дженериков в репозиториях Spring Data JPA
  • Как сохранить типы JSR-310 с помощью Spring Data JPA?
  • В чем разница между интерфейсами CrudRepository и JpaRepository в Spring Data JPA?
  • Обработка мягких удалений с помощью Spring JPA
  • setMaxResults для annotations Spring-Data-JPA?
  • Как работает FetchMode в Spring Data JPA
  • Может ли Spring Data REST использовать QueryDSL для выполнения более сложных запросов?
  • Spring Data JPA: пакетная вставка для вложенных объектов
  • Как проверить поддержку декларативного кэширования Spring в хранилищах Spring Data?
  • При использовании методов getOne и findOne Spring Data JPA
  • Interesting Posts

    Является ли Windows Home и Windows Home Single Language той же версией?

    Как я могу прерывать текущий код в R с помощью команды клавиатуры?

    Получение «diff» между двумя массивами в C #?

    Исключение при записи в документ xlsx несколько раз с помощью apache poi 3.7

    CSS Child vs Descendant selectors

    Разбор локального HTML-файла

    Как узнать, заражен ли ваш компьютер вирусом dnschanger?

    Как включить настраиваемые местоположения для индексирования в поиск в меню «Пуск»?

    Aptitude vs. apt-get: Какой из рекомендованных (так называемых «правильных») инструментов использовать?

    Невозможно выполнить загрузку на жесткий диск или оптический, если материнская плата в режиме AHCI

    Java: Локальная переменная mi, определенная в охватывающей области, должна быть окончательной или эффективно конечной

    Утверждение о списке в Junit

    Компьютер просыпается сам по себе, но источник пробуждения неизвестен

    Как создать адрес электронной почты для внешнего получателя?

    Принудительное приложение для использования определенного сетевого интерфейса

    Давайте будем гением компьютера.