2014-12-30 34 views
0

我遇到如下定義Hibernate的HQL加入複合鍵

CustomersDAO.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

試圖 加入兩個實體/表寫HQL查詢的一些問題
@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; 
} 



} 

Address.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(); 

感謝您的幫助

問候 翁

回答

0

確定

它實際上是遠遠simplier

查詢必須是沒有任何 「加入」 除了和工作...

下面的例子

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

感謝不過要幫忙!

問候