2012-01-11 5 views
5

Tôi có lớp nàyLàm thế nào để sử dụng @Formula (trong Hibernate) để chỉ cùng một đối tượng (hiện tại)

@Entity 
@Table(name = "DB.APPL_SESSION") 
@AttributeOverrides({@AttributeOverride(name = "id", column = @Column(name = "APPL_SESSION_ID"))}) 
@SequenceGenerator(name = "TableSequence", sequenceName = "DB.APPL_SESSION_SQ") 

public class AiSession{ 

@Formula("(select sum(nvl(budg.AMT_OV,budg.AMT)) from DB.BUDGET budg where budg.APPL_SESSION_ID = APPL_SESSION_ID)") 
private LocalDate realSessionStartDate; 

Trong công thức trên, chúng tôi đã làm việc với đối tượng DB.BUDGET và với đối tượng id hiện tại (APPL_SESSION_ID). Nhưng bây giờ tôi chỉ muốn làm việc với các thành viên biến tiếp theo (StartDate) mà là ở lớp AidApplicantYearSession

@Basic 
@Temporal(TemporalType.DATE) 
@Column(name = "START_OV_DT") 
private Date overrideStartDate; 

Làm thế nào tôi nên viết một công thức mà trông giống như ở trên nhưng chỉ sử dụng biến thành viên của đối tượng? Tôi đã đến với

@Formula("(select START_OV_DT from DB.APPL_SESSION)") 

Đó có phải là cách chính xác không? Logic cho hai công thức là khác nhau.

Trả lời

5

@Formula chỉ đơn giản là đưa vào mệnh đề SQL select, do đó bạn có thể sử dụng tên cột trong nó:

@Formula("START_OV_DT") 

Xem thêm:

+0

Cảm ơn bạn đã phản hồi. Trên tài liệu, nó nói "Đôi khi, bạn muốn Cơ sở dữ liệu thực hiện một số tính toán cho bạn thay vì trong JVM". Cái nào hiệu quả hơn (tính toán trong JVM hoặc để cơ sở dữ liệu thực hiện một số tính toán) nếu nó là công thức phức tạp hơn? – WowBow

+0

Tôi quên đề cập đến rằng tôi cũng nên sử dụng chức năng NVL. Đây là cách tôi đã làm điều đó @Formula ("(chọn NVL (START_OV_DT, START_DT)") Không bỏ chọn sẽ giống như giữ nó? – WowBow

+1

@MatX: Tôi không nghĩ rằng nó có ý nghĩa để sử dụng '@ Công thức' để tính toán dễ dàng có thể được thực hiện ở phía ứng dụng. Có, nó sẽ ổn cho nhiều trường. – axtavt

0

tôi có một bảng có tổng số khối BITX_SESSION.TOTAL BLOCKS

Bây giờ tôi cần tính phần trăm từ một bảng khác có số khối nhận được BITX_SESSION_DEVICE.BLOCKS_RECEIVED Cả hai bảng đều có session_id để xác định phiên tôi cần.

Kết quả tôi cần là phần trăm khối nhận được (BLOCKS_RECEIVED/TOTAL BLOCKS * 100). Không chắc chắn cách viết bằng Công thức.