Spring Data @Query 주석 값 안에 상수를 사용하는 방법이 있습니까?
상수 값을 하드코딩하는 것이 아니라 참조 변수를 통해 지정하고 싶습니다.
예를 들어 다음 쿼리를 작성하는 대신 다음 쿼리를 작성합니다.
@Query(value = "SELECT u FROM UserModel u WHERE u.status = 1")
..나는 하드코딩된 값 '1'을 추출하고 다음과 같은 것을 쓰고 싶습니다.
@Query(value = "SELECT u FROM UserModel u WHERE u.status = UserModel.STATUS_ACTIVE") //doesn't compile
스프링 데이터 쿼리 내에서 두 번째 예제와 같이 상수를 지정할 수 있는 방법이 있습니까?
다음과 같이 정규화된 클래스 이름을 사용해야 합니다.
@Query("SELECT u FROM UserModel u WHERE u.status = com.example.package.UserModel.STATUS_ACTIVE")
하지만 나쁜 점은 IDE가 클래스 사용자 모델의 사용으로 인식하지 못한다는 것입니다. 유일한 장점은 대부분의 경우 충분한 값을 한 곳에 보관할 수 있다는 것입니다.이는 IntelliJ IDEA 2017.1에서 해결되었습니다.다른 IDE에 대해서는 잘 모릅니다.
저는 다음과 같은 방법을 사용하는 것을 추천합니다.Enum
해당 개체에 대한 해당 열거 필드가 있습니다.
public enum UserModelStatus{
ACTIVE, INACTIVE
}
public UserModel{
/* Other fields ommitted */
@Enumerated(EnumType.STRING)
private UserModelStatus status;
/* Get/Set Method */
}
그런 다음 저장소 메서드를 만듭니다.
@Repository
public interface UserModelRepository extends JpaRepository<UserModel, Long>{
public List<UserModel> findByStatus(UserModelStatus status);
}
Spring Data를 사용하면 JPQL을 쓸 필요도 없을 것입니다. 다음과 같이 메소드를 호출합니다.
@Autowired
UserModelRepository userModelRepository;
public void someMethod(){
List<UserModel> userModels = userModelRepository.findByStatus(UserModelStatus.ACTIVE);
}
다음과 같이 사용합니다.
리포지토리 인터페이스에서 다음과 같이 상수를 정의합니다.
public static final String USER_QUERY = "SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE;
이제 사용할 수 있습니다.
@Query(value=USER_QUERY)
SpELT() 연산자를 통해 쿼리에서 String constant 클래스를 사용할 수 있었습니다. 이를 통해 주어진 클래스의 정적 메서드 및 상수에 액세스할 수 있습니다.문자열의 경우 식을 작은 따옴표(')로 래핑해야 합니다(QuerySyntaxException이 발생하는 경우).
이런 거 해보세요.
@Query("SELECT u FROM #{#entityName} u " +
"WHERE u.status = #{T(fully.qualified.path.UserModel).STATUS_ACTIVE}")
참고: #{#entityName} 대신 UserModel을 사용하면 작동하지 않습니다.
간단히 언급된 문서에서는 다음을 참조하십시오. https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions-beandef-xml-based
언제부터 지원되는지 모르겠습니다. 스프링 데이터-jpa 1.4.3, 스프링 프레임워크 3.2.17
이에 대한 답은 표준 솔루션에 대한 '아니오'인 것 같습니다.
일부 JPA 구현은 자체적인 해결책을 가지고 있을 수 있지만 하나에 대한 최대 절전 모드는 여기서 다른 답변이 제시하는 방법 중 어떤 것도 지원하지 않는 것 같습니다.
@Query 주석 내부에 상수를 직접 사용하려면 다음과 같은 내용을 작성할 수 있습니다.
@Query("SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE)
네, 이것이 더 우아하고 읽을 수 있는 방법입니다.예를 들어,
@Query("SELECT xyz.id FROM XYZ AS xyz WHERE xyz.status = " + Status.OPEN + " AND xyz.active=1")
서.Status
입니다를 입니다.
public class Status {
public static final int OPEN = 1;
}
언급URL : https://stackoverflow.com/questions/18402988/is-there-a-way-to-use-constants-inside-spring-data-query-annotation-value
'IT' 카테고리의 다른 글
엑셀병합셀일시 (0) | 2023.10.15 |
---|---|
MySQL UPDATE 데이터를 열에 추가 (0) | 2023.10.15 |
누가 jQuery File Upload 플러그인 구현 방법을 설명해 줄 수 있습니까? (0) | 2023.10.15 |
IntelliJ에서 셀레늄 서버를 시작하려고 할 때 jar 파일이 잘못되었거나 손상되었습니다. (0) | 2023.10.15 |
주문 기준으로 카운트 선택(*) (0) | 2023.10.15 |