IT

Spring Data @Query 주석 값 안에 상수를 사용하는 방법이 있습니까?

itgroup 2023. 10. 15. 17:14
반응형

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

반응형