2013-08-23 65 views
13

Tôi không muốn mã hóa các giá trị không đổi, tôi muốn chỉ định chúng thông qua một biến tham chiếu.Có cách nào để sử dụng hằng số bên trong giá trị chú thích @ Data Data @Query không?

Ví dụ, thay vì sau đó viết các truy vấn tiếp theo:

@Query(value = "SELECT u FROM UserModel u WHERE u.status = 1") 

..Tôi muốn trích xuất các giá trị mã hóa cứng '1' và viết một cái gì đó như:

@Query(value = "SELECT u FROM UserModel u WHERE u.status = UserModel.STATUS_ACTIVE") //doesn't compile 

Có cách nào để xác định các hằng số như trong ví dụ thứ hai bên trong truy vấn dữ liệu xuân?

Trả lời

5

Tôi khuyên bạn nên tạo một Enum và một trường có enum trên thực thể.

public enum UserModelStatus{ 
    ACTIVE, INACTIVE 
} 

public UserModel{ 

    /* Other fields ommitted */ 

    @Enumerated(EnumType.STRING) 
    private UserModelStatus status; 

    /* Get/Set Method */ 
} 

Sau đó tạo phương pháp kho của bạn:

@Repository 
public interface UserModelRepository extends JpaRepository<UserModel, Long>{ 

    public List<UserModel> findByStatus(UserModelStatus status); 

} 

Sử dụng dữ liệu mùa xuân bạn thậm chí sẽ không cần phải viết JPQL chỉ gọi phương thức như:

@Autowired 
    UserModelRepository userModelRepository; 

    public void someMethod(){ 
     List<UserModel> userModels = userModelRepository.findByStatus(UserModelStatus.ACTIVE); 
    } 
+1

thế nào thế nào tôi có thể dễ dàng phủ nhận findByStatus (trạng thái UserModelStatus)? Tôi có nghĩa là có được tất cả userModel nơi UserModelStatus là ** không ** trạng thái? – stratosgear

+1

findByStatusNot (trạng thái UserModelStatus) –

+0

Điều này cho thấy toàn bộ sức mạnh của dữ liệu mùa xuân. Dính vào nó cho các truy vấn đơn giản, không cần phải viết sql mình. – membersound

1

Khi bạn muốn sử dụng các hằng số trực tiếp bên trong chú thích @Query của bạn, bạn có thể viết một cái gì đó như:

@Query("SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE) 
.210
+9

Điều này sẽ trả về lỗi nói rằng giá trị thuộc tính phải không đổi. – Cleankod

+0

Đó là những gì tôi đã nói. Câu trả lời này là về cách sử dụng hằng số trong chú thích @Query. – h3nrik

+1

Có nhưng CONSTANT + CONSTANT không liên tục nữa :) Do đó lỗi. – Cleankod

13

Bạn phải sử dụng tên lớp đầy đủ như thế này:

@Query("SELECT u FROM UserModel u WHERE u.status = com.example.package.UserModel.STATUS_ACTIVE") 

Các điều xấu về nó mặc dù là một IDE sẽ không nhận ra đây là một cách sử dụng của UserModel lớp. Ưu điểm duy nhất là bạn có thể giữ giá trị ở một nơi, đó là đủ thời gian.

+1

điều này đặt ra một ngoại lệ là 'com không được xác định' .. Ít nhất cho số – bert

+0

của tôi Bạn đã áp dụng tên gói đủ điều kiện cho mục đích của mình chưa? Tôi có nghĩa là bạn phải trỏ đến đúng lớp hiện có với tên đầy đủ của nó. – Cleankod

+0

Vâng tôi đã làm. Tôi đã giải quyết được vấn đề khi chuyển qua các giá trị enum để so sánh. không thanh lịch, nhưng làm việc – bert

0

Câu trả lời cho câu hỏi này có vẻ là 'Không' cho giải pháp chuẩn.

Một số triển khai JPA có thể có các giải pháp của riêng chúng nhưng hibernate cho một dường như không và dường như không hỗ trợ bất kỳ phương pháp được đề xuất bởi câu trả lời khác ở đây.

2

Sử dụng như sau:

Trong giao diện kho lưu trữ, xác định một hằng số như sau:

public static final String USER_QUERY = "SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE; 

Bây giờ bạn có thể sử dụng

@Query(value=USER_QUERY) 
0

tôi đã quản lý để sử dụng lớp String liên tục trong truy vấn thông qua toán tử SpEL T(), cho phép bạn truy cập vào các phương thức tĩnh và các hằng số trên một lớp đã cho. Đối với chuỗi Tôi phải bọc biểu thức với dấu nháy đơn ('), có lẽ nó sẽ là cần thiết cho bạn là tốt (nếu QuerySyntaxException xảy ra).

Hãy thử một cái gì đó như thế này,

@Query("SELECT u FROM #{#entityName} u " + 
     "WHERE u.status = #{T(fully.qualified.path.UserModel).STATUS_ACTIVE}") 

Lưu ý: bằng cách nào đó nó không hoạt động nếu bạn sử dụng UserModel thay vì # {# Tên pháp nhân}.

Trong tài liệu giới thiệu vắn tắt của nó, xem: https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions-beandef-xml-based

Không biết kể từ khi điều này được hỗ trợ, tôi đã có mùa xuân-data-JPA 1.4.3, mùa xuân-framework 3.2.17

Các vấn đề liên quan