복붙노트

[SPRING] 매개 변수 속성을 가진 스프링 데이터 JPA 쿼리

SPRING

매개 변수 속성을 가진 스프링 데이터 JPA 쿼리

입력 매개 변수의 속성을 쿼리 매개 변수로 사용하는 Spring 데이터 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 매개 변수에 속성 ​​이름을 지정하는 것을 좋아하지 않습니다.

가장 깔끔한 대안은 무엇입니까?     }

해결법

  1. ==============================

    1.이 링크는 SpEL 표현식이 지원되는 스프링 데이터 JPA M1을 도와줍니다. 비슷한 예가 다음과 같습니다.

    이 링크는 SpEL 표현식이 지원되는 스프링 데이터 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

  2. ==============================

    2.다음과 같이 서명을 사용하여 쿼리 메서드를 정의합니다.

    다음과 같이 서명을 사용하여 쿼리 메서드를 정의합니다.

    @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 reference를 확인하십시오.

  3. ==============================

    3.당신이 원하는 것은 불가능합니다. 두 개의 매개 변수를 작성하고 별도로 바인드해야합니다.

    당신이 원하는 것은 불가능합니다. 두 개의 매개 변수를 작성하고 별도로 바인드해야합니다.

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

    4.다음과 같이해볼 수 있습니다 :

    다음과 같이해볼 수 있습니다 :

    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);
        }
    
  5. ==============================

    5.인터페이스 기본 방법으로 해결할 수도 있습니다.

    인터페이스 기본 방법으로 해결할 수도 있습니다.

     @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());
    }
    

    물론 실제 저장소 기능을 공개적으로 볼 수도 있습니다.

  6. ==============================

    6.@Service도 사용하고 계십니까? 왜냐하면 만약 당신이 그렇다면, 당신은 @Service에 PersonRepository를 @Autowired 할 수 있고, 서비스에서는 Name 클래스를 호출하고 @CuriosMind ...가 제안한 양식을 사용합니다 :

    @Service도 사용하고 계십니까? 왜냐하면 만약 당신이 그렇다면, 당신은 @Service에 PersonRepository를 @Autowired 할 수 있고, 서비스에서는 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);
    }
    

    서비스의 저장소에서 메소드를 호출 할 때 매개 변수를 전달할 수 있습니다.

  7. ==============================

    7.우리가 JpaRepository를 사용한다면 내부적으로 쿼리를 생성 할 것입니다.

    우리가 JpaRepository를 사용한다면 내부적으로 쿼리를 생성 할 것입니다.

    견본

    노트

    복잡한 쿼리가 필요하다고 가정하면 다음과 같은 수동 쿼리를 작성해야합니다.

    @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);
    
  8. ==============================

    8.

    @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();
        }
    
  9. ==============================

    9.

        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);
    
  10. from https://stackoverflow.com/questions/10802798/spring-data-jpa-query-with-parameter-properties by cc-by-sa and MIT license