매개 변수 속성이 있는 스프링 데이터 JPA 쿼리
입력 매개 변수의 속성을 쿼리 매개 변수로 사용하는 스프링 데이터 JPA 쿼리를 선언하는 가장 간단한 방법은 무엇입니까?
예를 들어 엔티티 클래스가 있다고 가정합니다.
public class Person {
@Id
private long id;
@Column
private String forename;
@Column
private String surname;
}
및 다른 클래스:
public class Name {
private String forename;
private String surname;
[constructor and getters]
}
그럼 스프링 데이터 저장소를 다음과 같이 쓰고 싶습니다.
public interface PersonRepository extends CrudRepository<Person, Long> {
@Query("select p from Person p where p.forename = ?1.forename and p.surname = ?1.surname")
findByName(Name name);
}
...하지만 스프링 데이터 / JPA는 내가 부동산 이름을 지정하는 것을 좋아하지 않습니다.?1
파라미터를 지정합니다.
가장 깔끔한 대안은 무엇일까요?
이 링크는 SpEL 식을 지원하는 Spring Data JPA M1에 도움이 됩니다.유사한 예는 다음과 같습니다.
@Query("select u from User u where u.firstname = :#{#customer.firstname}")
List<User> 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);
}
자세한 내용은 스프링 데이터 JPA 참조를 참조하십시오.
당신이 원하는 것은 불가능합니다.2개의 파라미터를 생성하여 개별적으로 바인드해야 합니다.
select p from Person p where p.forename = :forename and p.surname = :surname
...
query.setParameter("forename", name.getForename());
query.setParameter("surname", name.getSurname());
인터페이스의 디폴트 방식에서도 해결할 수 있습니다.
@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());
}
물론 실제 저장소 기능은 여전히 공개적으로 볼 수 있습니다.
다음과 같은 작업을 수행할 수 있습니다.
public interface PersonRepository extends CrudRepository<Person, Long> {
@Query("select p from Person AS p"
+ " ,Name AS n"
+ " where p.forename = n.forename "
+ " and p.surname = n.surname"
+ " and n = :name")
Set<Person>findByName(@Param("name") Name name);
}
JpaRepository를 사용하는 경우 내부에서 쿼리가 생성됩니다.
샘플
findByLastnameAndFirstname(String 성, String 이름)
findByLastnameOrFirstname(String 성, String 이름)
find By Start Date Between (날짜 1, 날짜 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<SalesOrder> findAllSalesByDriver(@Param("clientId")Integer clientId, @Param("driver_username")String driver_username, @Param("fdate") Date fDate, @Param("tdate") Date tdate);
Spring Data JPA의 단순성은 추가 지정 없이 저장소의 함수 이름에서 해석을 시도한다는 것입니다.@Query
또는@Param
주석입니다.완전한 이름을 입력할 경우 이름과 성을 구분하여 다음과 같이 사용합니다.
HotelEntity findByName(String name);
My HotelEntity에는 필드 이름이 포함되어 있으므로 JPA는 자체적으로 해석하여 쿼리하려는 필드의 이름을 추론하고 내부적으로 후속 쿼리를 작성합니다.JPA 문서의 추가 증거 -
상세 - 이쪽
고객님은 고객님의@Service
왜냐면 만약 그렇다면, 넌 할 수 있어@Autowired
당신의.PersonRepository
에게@Service
그 후 서비스에서는,Name
class 및 @CuiosMind... 라는 형식을 사용합니다.제안:
@Query(select p from Person p where p.forename = :forename and p.surname = :surname)
User findByForenameAndSurname(@Param("surname") String lastname,
@Param("forename") String firstname);
}
서비스 내 저장소에서 메서드를 호출하면 이들 파라미터를 전달할 수 있습니다.
for using this, you can create a Repository for example this one:
Member findByEmail(String email);
List<Member> 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();
}
언급URL : https://stackoverflow.com/questions/10802798/spring-data-jpa-query-with-parameter-properties
'programing' 카테고리의 다른 글
개인 방법 Jasmine을 사용한 단위 테스트 (0) | 2023.03.12 |
---|---|
ORACLE의 select 문에서 데이터 유형 필드 가져오기 (0) | 2023.03.12 |
Mongoose에서 다른 스키마 참조 (0) | 2023.03.12 |
Word Press는 왜 아직도 adslash(), register_globals() 및 magic_quotes를 사용하고 있습니까? (0) | 2023.03.12 |
JSON과 XML의 비교 (0) | 2023.03.12 |