2012-09-24 2 views
1

안녕과 테이블 조인 문제 사용 기준 전 기준 사용하여이 쿼리를 시도 :이 두 테이블 사이에JPA - 내부는 복합 키

select p.idpregled,p.idkarton,p.datum_pregleda,k.status from pregled p 
inner join karton k 
on p.idkarton = k.idkarton 
where k.status ='Otvoren'; 

관계는 다음과 같이이다 : 두 가지의

table karton 
idkarton (pk) 
.. 
.. 
table pregled 
idpregled (pk) 
idkarton (pk,fk) 
. 
. 

코드 이 2 개의 테이블 :

@Entity 
@Table(name ="karton") 
public class Karton implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 


    @Id 
    private KartonPrimaryKey pk = new KartonPrimaryKey(); 

    @Column(name ="status", nullable = false) 
    private String status; 
    @Column(name="datum_otvaranja" , nullable = false) 
    private Date datumOtvaranja; 
    @Column(name = "napomena") 
    private String napomena; 
    @ManyToOne(targetEntity = Pacijent.class) 
    @JoinColumn(name ="idpacijent",nullable = false,unique = true) 
    private Pacijent pacijent; 

    @OneToMany(mappedBy = "pk.kartonForeignKey") 
    @GwtTransient 
    private List<Pregled> pregledi = new LinkedList<Pregled>(); 




    public KartonPrimaryKey getPk() { 
     return pk; 
    } 
    public void setPk(KartonPrimaryKey pk) { 
     this.pk = pk; 
    } 

    public String getStatus() { 
     return status; 
    } 
    public void setStatus(String status) { 
     this.status = status; 
    } 
    public Date getDatumOtvaranja() { 
     return datumOtvaranja; 
    } 
    public void setDatumOtvaranja(Date datumOtvaranja) { 
     this.datumOtvaranja = datumOtvaranja; 
    } 
    public String getNapomena() { 
     return napomena; 
    } 
    public void setNapomena(String napomena) { 
     this.napomena = napomena; 
    } 
    public Pacijent getPacijent() { 
     return pacijent; 
    } 
    public void setPacijent(Pacijent pacijent) { 
     this.pacijent = pacijent; 
    } 
    public List<Pregled> getPregledi() { 
     return pregledi; 
    } 
    public void setPregledi(List<Pregled> pregledi) { 
     this.pregledi = pregledi; 
    } 



     public int hashCode(){ 
      final int prime = 31; 
      int result = 1; 
      result = prime * result 
        +((pregledi == null) ? 0 : pregledi.hashCode()); 
      result = prime * result 
        +((pk == null) ? 0 : pk.hashCode()); 
      return result; 
     } 

     public boolean equals(Object obj){ 
      if (this == obj) 
      return true; 
      if (obj == null) 
      return false; 
      if(getClass() != obj.getClass()) 
       return false; 
      final Karton other = (Karton) obj; 
      if (pregledi == null) { 
      if(other.pregledi != null) 
       return false; 
      }else if(!pregledi.equals(other.pregledi)) 
       return false; 
      if (pk == null) { 
      if(other.pk != null) 
       return false; 
     }else if(!pk.equals(other.pk)) 
      return false; 
      return true; 
     } 


} 

@Embeddable 
public class KartonPrimaryKey implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 



    @Column(name ="idkarton") 
    Integer idKarton; 





    public Integer getIdKarton() { 
     return idKarton; 
    } 





    public void setIdKarton(Integer idKarton) { 
     this.idKarton = idKarton; 
    } 





    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((idKarton == null) ? 0 : idKarton.hashCode()); 
//  result = prime * result + ((version == null) ? 0 : version.hashCode()); 
     return result; 
    } 


    public boolean equals(Object obj) { 
     if(this == obj) 
      return true; 
     if(obj == null) 
      return false; 
     if(getClass() != obj.getClass()) 
      return false; 
     final KartonPrimaryKey other = (KartonPrimaryKey) obj; 
     if (idKarton == null) { 
      if(other.idKarton != null) 
       return false; 
     }else if(!idKarton.equals(other.idKarton)) 
      return false; 
     return true; 
    } 

} 
@Entity 
@Table(name = "pregled") 

@AssociationOverrides({ 
    @AssociationOverride(name = "pk.idPregled", 
     joinColumns = @JoinColumn(name = "idpregled")), 
    @AssociationOverride(name = "pk.kartonForeignKey", 
     joinColumns = @JoinColumn(name = "idkarton")) }) 
public class Pregled implements Serializable { 





    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 



    @EmbeddedId 
    PregledKartonId pk = new PregledKartonId(); 



    @Column(name ="datum_pregleda") 
    private Date datumPregleda; 

    @ManyToOne(targetEntity = Dijagnoza.class) 
    @JoinColumn(name ="iddijagnoza",nullable = false) 
    private Dijagnoza dijagnoza; 

    @OneToMany(mappedBy = "primaryKey.pregledForeignKey") 
    @GwtTransient 
    private List<PregledStavke> pregledStavke = new LinkedList<PregledStavke>(); 


    public Dijagnoza getDijagnoza() { 
     return dijagnoza; 
    } 
    public void setDijagnoza(Dijagnoza dijagnoza) { 
     this.dijagnoza = dijagnoza; 
    } 


    public PregledKartonId getPregledKarton() { 
     return pk; 
    } 

    public void setPregledKarton(PregledKartonId pregledKarton) { 
     this.pk = pregledKarton; 
    } 

    @Transient 
    public Integer getIdPregled() { 
     return pk.getIdPregled(); 
    } 

    public void setIdPregled(Integer id) { 
     pk.setIdPregled(id); 
    } 





    public PregledKartonId getPk() { 
     return pk; 
    } 
    public void setPk(PregledKartonId pk) { 
     this.pk = pk; 
    } 
    public List<PregledStavke> getPregledStavke() { 
     return pregledStavke; 
    } 
    public void setPregledStavke(List<PregledStavke> pregledStavke) { 
     this.pregledStavke = pregledStavke; 
    } 

    @Transient 
    public Karton getKarton() { 
     return getPregledKarton().getKartonForeignKey(); 
    } 
    public void setKarton(Karton karton) { 
     getPregledKarton().setKartonForeignKey(karton); 
    } 
    public Date getDatumPregleda() { 
     return datumPregleda; 
    } 
    public void setDatumPregleda(Date datumPregleda) { 
     this.datumPregleda = datumPregleda; 
    } 


    public boolean equals(Object o) { 
     if (this == o) 
      return true; 
     if (o == null || getClass() != o.getClass()) 
      return false; 

     Pregled that = (Pregled) o; 
     if (pregledStavke == null) { 
      if (that.pregledStavke != null) { 
       return false; 
      } 
     }else if(!pregledStavke.equals(that.pregledStavke)) 
      return false; 
     if (pk == null) { 
      if (that.pk != null) 
       return false; 

     }else if (!pk.equals(that.pk)) 
      return false; 


     return true; 
    } 
// 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result +((pregledStavke == null) ? 0 : pregledStavke.hashCode()); 
     result = prime * result + 
       ((pk == null) ? 0 : pk.hashCode()); 
     return result; 
    } 







} 


@Embeddable 
public class PregledKartonId implements Serializable { 


    @GeneratedValue 
    @Column(name = "idpregled") 
    Integer idPregled; 

    @ManyToOne 
    private Karton kartonForeignKey; 







    public Integer getIdPregled() { 
     return idPregled; 
    } 

    public Karton getKartonForeignKey() { 
     return kartonForeignKey; 
    } 

    public void setKartonForeignKey(Karton kartonForeignKey) { 
     this.kartonForeignKey = kartonForeignKey; 
    } 

    public void setIdPregled(Integer idPregled) { 
     this.idPregled = idPregled; 
    } 



    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((idPregled == null)? 0 : idPregled.hashCode()); 
     result = prime + result 
       + ((kartonForeignKey == null) ? 0 : kartonForeignKey.hashCode()); 
     return result; 
    } 



    public boolean equals(Object o){ 
     if (this == o) return true; 
     if(o == null) 
      return false; 
     if(getClass() != o.getClass()) 
      return false; 

     final PregledKartonId that = (PregledKartonId) o; 
     if(idPregled == null){ 
      if(that.idPregled != null) 
       return false; 
     }else if(!idPregled.equals(that.idPregled)) 
      return false; 
     if(kartonForeignKey == null){ 
      if(that.kartonForeignKey != null) 
       return false; 
     }else if(!kartonForeignKey.equals(that.kartonForeignKey)) 
      return false; 



     return true; 
    } 



} 

나는 기준이 코드를 시도하지만,이 성공적으로되지 않았습니다 :

01 23,516,
Criteria criteria = session.createCriteria(Pregled.class); 
     criteria.setFetchMode("kartonForeignKey", FetchMode.JOIN).add(Restrictions.eq("status", "Otvoren")); 
List<Pregled> pregledi = criteria.list(); 

이 코드 trows 나에게 스택 추적이 오류 : 사전에

com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.util.List com.fit.klinika.client.pregled.PregledService.queryPregledOtvoren()' threw an unexpected exception: org.hibernate.QueryException: could not resolve property: status of: com.fit.klinika.client.pregled.Pregled 
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:385) 
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:588) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 

감사합니다 :)

나는이하려고하면이 잘 작동

Criteria criteria = session.createCriteria(Pregled.class,"pregled"); 
      criteria.createAlias("pregled.pk.kartonForeignKey","karton"); 

, 만약 내가 이 코드 행을 어디에 코드를 사용하여 추가 했습니까?

criteria.add(Restrictions.eq("karton", "Otvoren")); 

같은 오류가 발생합니다. ???

는 그럼 난에 의해 해결되지 않은이 문제가

https://hibernate.onjira.com/browse/HB-417,

https://hibernate.onjira.com/browse/HHH-1742,

https://hibernate.onjira.com/browse/HHH-1570

이 버그가 온다 최대 절전 모드 이것에 대해 구글에 대한 몇 가지 검색을 수행하고를 찾을 수있다 2003 년부터, 그리고 최대 절전 모드로 고정되지 않습니다, 이것은 가능합니까 ?? wtf?!?!?!?)

답변

0

오류 메시지가 당신의 Pregled 클래스에서 "상태"라는 이름의 속성을 찾을 수 없다는 말은 ... : 내가 틀렸다면

저를 수정합니다. 코드 샘플에서 Pregled 클래스에 실제로 "status"라는 매핑 된 필드가 없다는 것을 알 수 있습니다.

+0

안녕하세요, 도움을 주셔서 감사합니다. 나는 Karton 클래스에서 속성을 사용하여 "status"속성 이름을 얻습니다. – dusmanka