programing

매개 변수 속성이 있는 스프링 데이터 JPA 쿼리

closeapi 2023. 3. 12. 10:49
반응형

매개 변수 속성이 있는 스프링 데이터 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그 후 서비스에서는,Nameclass 및 @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

반응형