簡體   English   中英

Hibernate HQL與復合鍵聯接

[英]Hibernate HQL Join with composite Key

我在嘗試編寫HQL查詢以連接如下定義的兩個實體/表時遇到一些問題

客戶DAO.java

@Entity
@Table(name="customers")
public class CustomerDAO implements Serializable {

private static final long serialVersionUID = 1L;

@EmbeddedId 
private CustomerNaming name;

@ManyToOne
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE) 
@JoinColumns({ @JoinColumn (name="city"), @JoinColumn(name="state"),@JoinColumn(name="via") })
private Address indirizzo;

@Column (name="email")
private String email;

@Column (name="mailinglist")
private boolean mailinglist;

@Column (name="sex")
private String sex;

public CustomerDAO()
{
    indirizzo=new Address();
    name=new CustomerNaming();
}



public CustomerNaming getNome() {
    return name;
}
public void setNome(CustomerNaming nome) {
    this.name = nome;
}

public Address getIndirizzo() {
    return indirizzo;
}
public void setIndirizzo(Address indirizzo) {
    this.indirizzo = indirizzo;
}
public String getEmail() {
    return email;
}
public void setEmail(String email) {
    this.email = email;
}
public boolean isMailinglist() {
    return mailinglist;
}
public void setMailinglist(boolean mailinglist) {
    this.mailinglist = mailinglist;
}
public String getSex() {
    return sex;
}
public void setSex(String sex) {
    this.sex = sex;
}

@Override
public String toString() {
    return "Customer :  [nome=" + name.getNome()
            + ", cognome=" + name.getCognome() + ", indirizzo=" + indirizzo
            + ", email=" + email + ", mailinglist=" + mailinglist
            + ", sex=" + sex + "]";
}


}

CustomerNaming.java

@Embeddable
public class CustomerNaming implements Serializable {

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

@Column (name="nome")
private String nome;

@Column (name="cognome")
private String cognome;

public String getNome() {
    return nome;
}
public void setNome(String nome) {
    this.nome = nome;
}
public String getCognome() {
    return cognome;
}
public void setCognome(String cognome) {
    this.cognome = cognome;
}



}

地址.java

@Entity
@Table(name="indirizzi")
public class Address implements Serializable {
/**
 * 
 */
private static final long serialVersionUID = 1L;

@EmbeddedId
private AddressKey key;

@Column (name="cap")
private String cap;
//private ArrayList<State> state=new ArrayList<State>();

public Address(){
    key=new AddressKey();
}

public AddressKey getKey() {
    return key;
}

public void setKey(AddressKey key) {
    this.key = key;
}

public String getCap() {
    return cap;
}
public void setCap(String cap) {
    this.cap = cap;
}


}

AddressKey.java

@Embeddable
public class AddressKey implements Serializable{

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

@Column(name="via", nullable=false)
private String via;
@Column (name="city", nullable=false)
private String city;
@Column (name="state", nullable=false)
private String state;

public String getState() {
    return state;
}
public void setState(String state) {
    this.state = state;
}
public String getVia() {
    return via;
}
public void setVia(String via) {
    this.via = via;
}
public String getCity() {
    return city;
}
public void setCity(String city) {
    this.city = city;
}

}

如您所見,我已經(嘗試此操作……我仍在學習休眠方式……)在地址中創建一個復合PK,由AddressKey映射

所以我必須創建一個復合聯接來進行搜索,但是沒有成功

這是我的最后一個(不是最好的...大聲笑)嘗試...

        Query q=s.createQuery("FROM CustomerDAO cust JOIN (cust.indirizzo.key.via   cust.indirizzo.key.city  , cust.indirizzo.key.state) as indirizzo WHERE  cust.name.nome=:nome and cust.name.cognome like :cognome and cust.indirizzo.key.via like :via and cust.indirizzo.key.city like :city and cust.indirizzo.cap like :cap and cust.indirizzo.key.state like :state and cust.sex like :sex and c.email like :mail and cust.mailinglist like :mailinglist")
                .setString("nome","\'%"+c.getNome().getNome()+"%\'")
                .setString("cognome", c.getNome().getCognome())
                .setString("via", c.getIndirizzo().getKey().getVia())
                .setString("city", c.getIndirizzo().getKey().getCity())
                .setString("cap", c.getIndirizzo().getCap())
                .setString("state", c.getIndirizzo().getKey().getState())
                .setString("sex", c.getSex())
                .setString("mail",c.getEmail());
        if(q!=null)
            customers=(List<Object[]>)q.list();

在某些情況下,我從createQuery接收到空查詢...

在這種情況下...根本無法識別查詢

 org.hibernate.hql.ast.QuerySyntaxException: unexpected token: ( near line 1, column 43 [FROM myapp.customer.CustomerDAO cust JOIN (cust.indirizzo.key.via   cust.indirizzo.key.city  , cust.indirizzo.key.state) as indirizzo WHERE  cust.name.nome=:nome and cust.name.cognome like :cognome and cust.indirizzo.key.via like :via and cust.indirizzo.key.city like :city and cust.indirizzo.cap like :cap and cust.indirizzo.key.state like :state and cust.sex like :sex and c.email like :mail and cust.mailinglist like :mailinglist]

注意,比下面的簡單搜索更完美...

List<CustomerDAO> customers=(List<CustomerDAO>)(s.createQuery("from CustomerDAO where nome=:nome and cognome=:cognome").setString("nome", nome).setString("cognome", cognome)).list();

謝謝你的幫助

問候翁貝托

實際上這要簡單得多

該查詢必須沒有任何“加入”加法並且可以工作。

下面的例子

Query q=s.createQuery("FROM CustomerDAO cust WHERE  cust.name.nome like :nome ");

但是感謝您的幫助!

問候

翁貝托

暫無
暫無

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

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