2012-07-16 32 views
14

Tôi có 2 thực thể nhưHibernate Tham gia sử dụng các tiêu chí và những hạn chế

PayoutHeader.java

@Entity 
public class PayoutHeader extends GenericDomain implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id;   
    @Column 
    private Integer month; 
    @Column 
    private Integer year; 
    @OneToOne 
    private Bank bank; 
    @Column 
    private Double tdsPercentage; 
    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date **chequeIssuedDate**; 

    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date entryDate; 

} 

PayoutDetails java

@Entity 
public class PayoutDetails { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id;   

    @ManyToOne 
    private PayoutHeader payoutHeader; 

    @Column 
    private Double amount; 
    @Column 
    private String bankName; 
    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date clearingDate; 
    @OneToOne  
    private Advisor advisor; 

    @Column 
    private Long **advisorId**; 
} 

Tôi muốn viết truy vấn sử dụng Tiêu chuẩn Hibernate như

Select pd.* from PayoutDetails pd, PayoutHeader ph where pd.payoutheaderId = ph.id and pd.advisorId = 1 and and ph.chequeIssuedDate BETWEEN STR_TO_DATE('01-01-2011', '%d-%m-%Y') AND STR_TO_DATE('31-12-2011', '%d-%m-%Y') "; 

Tôi đã viết truy vấn như thế này

public List<PayoutDetails> getPayoutDetails(AdvisorReportForm advisorReportForm) { 
     Criteria criteria = getSession().createCriteria(PayoutDetails.class); 

     if (advisorReportForm.getAdvisorId() != null && advisorReportForm.getAdvisorId() > 0) { 
      criteria.add(Restrictions.eq("advisorId", advisorReportForm.getAdvisorId().toString())); 
     } 

     criteria.setFetchMode("PayoutHeader", FetchMode.JOIN) 
       .add(Restrictions.between("chequeIssuedDate", advisorReportForm.getFromDate(), advisorReportForm.getToDate()));   

     return criteria.list(); 
    } 

Nhưng là cho lỗi như

org.hibernate.QueryException: không thể giải quyết bất động sản: chequeIssuedDate của: org.commission.domain. payout.PayoutDetails

Tôi nghĩ là đang cố gắng tìm trường chequeIssuedDate trong PayoutDetails, nhưng lĩnh vực này là trong PayoutHeader. Làm cách nào để chỉ định bí danh trong khi tham gia?

Trả lời

15

Chỉ cần criteria.setFetchMode("PayoutHeader", FetchMode.JOIN) chỉ định rằng bạn muốn nhận tiêu đề bằng cách tham gia và trong trường hợp này có thể không cần thiết. Nó không thay đổi bảng nào được sử dụng trong các hạn chế. Cho rằng, có thể bạn muốn tạo ra một tiêu chí bổ sung hoặc một bí danh, nhiều hơn hoặc ít hơn như sau:

public List<PayoutDetails> getPayoutDetails(AdvisorReportForm advisorReportForm) { 
     Criteria criteria = getSession().createCriteria(PayoutDetails.class); 

     if (advisorReportForm.getAdvisorId() != null && advisorReportForm.getAdvisorId() > 0) { 
      criteria.add(Restrictions.eq("advisorId", advisorReportForm.getAdvisorId().toString())); 
     } 

     criteria.createCriteria("payoutHeader") 
       .add(Restrictions.between("chequeIssuedDate", advisorReportForm.getFromDate(), advisorReportForm.getToDate()));   

     return criteria.list(); 
    } 

hoặc (sử dụng một bí danh)

public List<PayoutDetails> getPayoutDetails(AdvisorReportForm advisorReportForm) { 
     Criteria criteria = getSession().createCriteria(PayoutDetails.class); 

     if (advisorReportForm.getAdvisorId() != null && advisorReportForm.getAdvisorId() > 0) { 
      criteria.add(Restrictions.eq("advisorId", advisorReportForm.getAdvisorId().toString())); 
     } 

     criteria.createAlias("payoutHeader", "header") 
       .add(Restrictions.between("header.chequeIssuedDate", advisorReportForm.getFromDate(), advisorReportForm.getToDate()));   

     return criteria.list(); 
    } 

Xem the Hibernate docs on Criteria Queries cho các ví dụ về điều này.

Cũng có thể không thích hợp để chuyển đổi advisorId thành chuỗi, vì thực tế là Long và có thể được ánh xạ tới trường số trong sql.

Nó thường cũng không lập bản đồ một cái gì đó giống như lĩnh vực advisorId này ở tất cả nếu bạn ánh xạ các advisor, và sử dụng một hạn chế dựa trên các lĩnh vực advisor, tương tự như cách các thỏa thuận này với lĩnh vực payoutHeader.

Tôi sẽ không lo lắng về việc nhận tất cả các trường từ tiêu đề, nhưng nó có thể hoạt động hơi khác nếu bạn nhận được phiên bản createCriteria hoạt động.

+0

Tôi đã cố gắng Giải pháp đầu tiên do bạn cung cấp, nó cho lỗi là "org.hibernate.QueryException: không thể giải quyết thuộc tính: payoutHeader của: org.commission.domain.payout.PayoutDetails" –

+0

Cảm ơn Don Roby :) Phương pháp tiếp cận thứ hai hoạt động . –

+0

Khi tôi in SQL được tạo ra trong nguyên nhân lựa chọn, nó có tất cả các cột từ cả hai bảng, tôi chỉ cần các cột từ bảng PayoutDetails. Làm thế nào để thiết lập chiếu cho điều này? –

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