2012-07-16 20 views
14

tengo 2 entidades comoHibernate Ingreso utilizando criterios y restricciones

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**; 
} 

Quiero escribir consulta utilizando criterios de Hibernate como

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') "; 

He escrito consulta como esta

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(); 
    } 

sino que se da un error como

org.hibernate.QueryException: no se pudo resolver la propiedad: chequeIssuedDate de: org.commission.domain. payout.PayoutDetails

Creo que está tratando de encontrar el campo chequeIssuedDate en PayoutDetails, pero este campo está en PayoutHeader. ¿Cómo especificar un alias durante la unión?

Respuesta

15

El criteria.setFetchMode("PayoutHeader", FetchMode.JOIN) solo especifica que desea obtener el encabezado mediante una combinación, y en este caso probablemente no sea necesario. No cambia qué tabla se usa en las restricciones. Por eso, es probable que desee para crear un criterio adicional o un alias, más o menos como sigue:

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(); 
    } 

o (usando un alias)

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(); 
    } 

Ver the Hibernate docs on Criteria Queries ejemplos de esto.

También es probable que no sea apropiado convertir el advisorId en una cadena, ya que de hecho es un Long y probablemente esté mapeado en un campo numérico en sql.

Es común tampoco mapear algo así como este campo advisorId en absoluto si asigna el advisor, y utiliza una restricción basada en el campo advisor, de manera similar a la forma en que esto se ocupa del campo de payoutHeader.

No me preocuparía obtener todos los campos del encabezado, pero podría funcionar de forma un poco diferente si obtienes la versión createCriteria para que funcione.

+0

He intentado Primera solución dada por usted, da error como "org.hibernate.QueryException: could not resolve property: payoutHeader of: org.commission.domain.payout.PayoutDetails" –

+0

Gracias Don Roby :) Second Approach funciona . –

+0

Cuando estoy imprimiendo SQL generado en la causa seleccionada, tiene todas las columnas de ambas tablas, solo necesito columnas de la tabla PayoutDetails. ¿Cómo establecer una proyección para esto? –

Cuestiones relacionadas