2010-05-27 42 views
6

Tôi có một nhà máy truy vấn lấy tên cột làm thuộc tính để tìm kiếm cột đó. Ngay bây giờ tôi đang đi qua tên của cột như một chuỗi, do đó, nó là loại hardcoded. Nếu tên của cột thay đổi trong chú thích của đối tượng, thì "phụ thuộc bị ẩn" sẽ bị hỏng.Lấy tên cột trong jpa

Có cách nào trong jpa để lấy tên thật của cột và có sẵn trong thời gian biên dịch, vì vậy tôi có thể sử dụng nó trong truy vấn không?

Trả lời

6

Tất nhiên, luôn có sự phản ánh về chú thích. Giả sử bạn có điển hình định nghĩa cột JPA:

@Basic(optional = true) 
    @Column(name = "MY_COLUMN_NAME_DESC", nullable = true, length = 255) 
    public String getDesc() { 
     return desc; 
    } 

Sau đó, có sản lượng phương thức getter kiểm tra giá trị tên cột (ví dụ thông qua từ here):

Method method = ... //obtain entity object 
Annotation[] annotations = method.getDeclaredAnnotations(); 

for(Annotation annotation : annotations){ 
    if(annotation instanceof Column){ 
     Column myAnnotation = (Column) annotation; 
     System.out.println("name: " + myAnnotation.name()); 
     System.out.println("value: " + myAnnotation.value()); 
    } 
} 

Ví dụ giả định phương pháp property access trong JPA thực thể nhưng không có gì ngăn cản bạn để áp dụng nó vào cấp trường bằng cách áp dụng sự phản chiếu vào một trường.

+0

cho người đam mê, cũng có thể kiểm tra điều này Nhận tên cột từ thuộc tính (http://stackoverflow.com/a/25520204/1225337) –

1

Điều này hơi muộn, tôi biết. Câu trả lời của Topchef là chính xác, nhưng có một vài yếu tố khác cần phải được xem xét nếu bạn muốn điều này làm việc cho các lớp thực thể tùy ý. Tôi đang thêm chúng trong trường hợp ai đó gặp phải câu trả lời này trong tìm kiếm trên web:

  • Chú thích lớp AttributeOverride có thể ghi đè cột được chỉ định bằng chú thích Cột.
  • Nếu chiến lược kế thừa được JOINED, cột có thể nằm trong một bảng khác ngay cả khi bảng không được chỉ định bằng chú thích Cột.
+0

Có API JPA để nhận chú thích cột cho thuộc tính không? hợp nhất XML, AttributeOverride, @Column. Cảm ơn. – eastwater

+0

@Dave: không ai biết tôi sợ, nhưng tôi chưa kiểm tra trong năm hoặc ba năm trước. Tôi cần phải làm điều này trong quá khứ và cũng có thể kết hợp các nguồn bạn đã đề cập. Rất khó, mã phức tạp để tái tạo một cái gì đó JPA phải làm anyway. Có lẽ đi qua Hibernate hoặc EclipseLink trực tiếp cung cấp một cách ... –

+0

Dường như họ không cung cấp API công khai như vậy. Nội bộ họ phải có một cái gì đó để kết hợp các cấu hình từ các nguồn khác nhau. – eastwater

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