Spring Data JPA / Boot: findBy … или

#java #spring-boot #spring-data #spring-data-jpa

#java #spring-загрузка #spring-данные #spring-data-jpa

Вопрос:

Я хочу написать метод поиска в моем репозитории, чтобы найти объект на основе одного ИЛИ другого поля, указав один параметр, например:

 @RepositoryDefinition(domainClass = Person.class, idClass = Long.class)
public interface PersonRepository extends CrudRepository<Person, Long> {

    List<Person> findAllByIdOrAnotherId(someId);
}
 

Как я могу это сделать без использования SQL?

Комментарии:

1. Вы можете аннотировать свой метод как @Query("from Person p where p.id = ?1 or p.anotherId = ?1") .

Ответ №1:

Я добавил второй параметр в метод, и он сработал.

 List<Transaction> findAllByIdOrParentId(Long id, Long parentId);
 

Это всего лишь определение метода, потому что я передаю методу из службы тот же параметр, что и:

 List<Transaction> transactions = transactionRepository.findAllByIdOrParentId(transactionId, transactionId);
 

Ответ №2:

Одна из замечательных особенностей Spring Data JPA заключается в том, что вы можете определять пользовательские запросы как абстрактные методы в своем интерфейсе.

В двух словах, вы можете определить новые критерии поиска, просто указав имя @Entity поля, по которому вы хотите запросить. Итак, допустим, я хочу с findAll() помощью Id and CustomId . Оба Id и CustomId являются полями в моем классе домена. Я бы сделал:

 List<Person> findAllByIdOrCustomId(someId, someCustomId);
 

Для получения дополнительной информации перейдите по ссылке ниже:
Spring Data JPA — ОПРЕДЕЛЕНИЕ МЕТОДОВ ЗАПРОСА

Комментарии:

1. Я уже пробовал это, но приложение даже не запускается. Вот трассировка стека: pastebin.com/TLaWLAer

2. Я нахожусь под корпоративным брандмауэром, поэтому не могу открыть и просмотреть эту ссылку atm

3. пожалуйста, посмотрите на это, когда у вас будет время, и перезвоните мне. Спасибо

4. Согласно вашим журналам исключений, проблема возникает из-за класса TransactionService при создании компонента transactionRepository. Я думаю, вам следует попробовать внедрение установщика для компонента transactionRepository вместо внедрения конструктора

5. это неверно, приложение завершает работу с явным сообщением об исключении: параметр недоступен для части customId SIMPLE_PROPERTY (1): [Is, Равно] НИКОГДА. Другими словами, вы должны предоставить второй аргумент, вы не можете использовать один и тот же аргумент как для Id, так и для customId.