簡體   English   中英

JPA-使用帶有組合鍵的Criteria內部聯接表的問題

[英]JPA - Issue using Criteria inner join table with composite key

嗨,我嘗試使用條件查詢此查詢:

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



}

我嘗試使用此標准代碼,但這未成功:

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

此代碼使我在堆棧跟蹤中出現此錯誤:

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

如果我使用where編碼添加了以下代碼行,則可以正常工作:

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?!?!!?!?

如果我錯了糾正我 :)...

錯誤消息是說它在Pregled類中找不到名為“ status”的屬性。 在您的代碼示例中,您可以看到Pregled類實際上沒有名為“ status”的映射字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM