2013-12-19 70 views
0

我有兩個模型類:Hibernate查詢,聯接和類似操作

1類看起來像這樣:

@Entity 
@Table(name = "cdm_location_charge_class", catalog = "emscribedx") 
public class Cdm_location_charge_class { 
    private static Logger LOG = Logger.getLogger(Cdm_location_charge_class.class); 
    private int indx; 
    private String location; 
    private String charge_Class; 
    private List <Cdm_trans> cdm_Trans; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "indx") 
    public int getIndx() { 
     return indx; 
    } 
    public void setIndx(int indx) { 
     this.indx = indx; 
    } 
    @Column(name = "location") 
    public String getLocation() { 
     return location; 
    } 
    public void setLocation(String location) { 
     this.location = location; 
    } 
    @Column(name = "charge_Class") 
    public String getCharge_Class() { 
     return charge_Class; 
    } 
    public void setCharge_Class(String charge_Class) { 
     this.charge_Class = charge_Class; 
    } 
    @OneToMany (mappedBy = "cdm_location_charge_class", targetEntity = Cdm_trans.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    public List<Cdm_trans> getCdm_Trans() { 
     return cdm_Trans; 
    } 
    public void setCdm_Trans(List<Cdm_trans> cdm_Trans) { 
     this.cdm_Trans = cdm_Trans; 
    } 

和第2類是這樣的:

@Entity 
@Table(name = "cdm_Trans", catalog = "emscribedx") 
public class Cdm_trans { 
private static Logger LOG = Logger.getLogger(Cdm_trans.class); 

private int indx; 
private String charge_Class; 
private String charge_Code; 
private String charge_Description; 
private String charge_Eligibility; 
private String exp_Date; 
private BigDecimal rate_Charge; 
private String cpt_Code; 
private int rev_Code; 
private String charge_Type; 
private Cdm_location_charge_class cdm_location_charge_class; 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "indx") 
public int getIndx() { 
    return indx; 
} 

public void setIndx(int indx) { 
    this.indx = indx; 
} 

@Column(name = "charge_Class") 
public String getCharge_Class() { 
    return charge_Class; 
} 

public void setCharge_Class(String charge_Class) { 
    this.charge_Class = charge_Class; 
} 

@Column(name = "charge_Code") 
public String getCharge_Code() { 
    return charge_Code; 
} 

public void setCharge_Code(String charge_Code) { 
    this.charge_Code = charge_Code; 
} 

@Column(name = "charge_Description") 
public String getCharge_Description() { 
    return charge_Description; 
} 

public void setCharge_Description(String charge_Description) { 
    this.charge_Description = charge_Description; 
} 

@Column(name = "charge_Eligibility") 
public String getCharge_Eligibility() { 
    return charge_Eligibility; 
} 

public void setCharge_Eligibility(String charge_Eligibility) { 
    this.charge_Eligibility = charge_Eligibility; 
} 

@Column(name = "exp_Date") 
public String getExp_Date() { 
    return exp_Date; 
} 

public void setExp_Date(String exp_Date) { 
    this.exp_Date = exp_Date; 
} 

@Column(name = "rate_Charge") 
public BigDecimal getRate_Charge() { 
    return rate_Charge; 
} 

public void setRate_Charge(BigDecimal rate_Charge) { 
    this.rate_Charge = rate_Charge; 
} 

@Column(name = "cpt_Code") 
public String getCpt_Code() { 
    return cpt_Code; 
} 

public void setCpt_Code(String cpt_Code) { 
    this.cpt_Code = cpt_Code; 
} 

@Column(name = "rev_Code") 
public int getRev_Code() { 
    return rev_Code; 
} 

public void setRev_Code(int rev_Code) { 
    this.rev_Code = rev_Code; 
} 

@Column(name = "charge_Type") 
public String getCharge_Type() { 
    return charge_Type; 
} 

public void setCharge_Type(String charge_Type) { 
    this.charge_Type = charge_Type; 
} 

@ManyToOne 
@JoinColumn(name = "charge_Class", insertable = false, updatable = false) 
public Cdm_location_charge_class getCdm_location_charge_class() { 
    return cdm_location_charge_class; 
} 

public void setCdm_location_charge_class(
     Cdm_location_charge_class cdm_location_charge_class) { 
    this.cdm_location_charge_class = cdm_location_charge_class; 
} 
} 

這兩個類對應兩個底層表s:

Cdm_trans和Cdm_location_charge_class。

我想創建一個Hibernate服務,這將使我相同的結果下面的SQL查詢:

select cdm_trans.* from Cdm_trans, Cdm_location_charge_class where 
cdm_location_charge_class.charge_Class = cdm_trans.charge_Class and 
cdm_location_charge_class.location = <Some location passed to the method> and 
Cdm_trans.charge_Description like '%<Some search term passed into the method>%; 

我更傾向於將做到這一點使用Hibernate的標準API。但是如果這是唯一的方法,我將會使用HQL。有人可以告訴我如何做到這一點?

我已經試過這HQL查詢:

Query query = session.createQuery("FROM cdm_location_charge_class as cl INNER JOIN cl.cdm_Trans where cl.location = :location and cdm_Trans.charge_Description like :search"); 

但是II得到一個錯誤: cdm_location_charge_class沒有映射

+2

那你試試? – Alex

+0

我試過這個HQL查詢: – Elliott

回答

2

如果你想使用標準,你只需要添加一個限制。

List cats = session.createCriteria(Cat.class) 
    .createCriteria("kittens") 
     .add(Restrictions.like("name", "Iz%")) 
    .list(); 

HQL例如:

Query query = session.createQuery("FROM Cdm_location_charge_class cl " + 
    "INNER JOIN cl.cdm_Trans trans " + 
    "where cl.location = :location and trans.charge_Description like :search") 
    .setParameter("location", locationValue) 
    .setParameter("search", "%" + searchValue + "%"); 
0

你能具體談談這個問題,或者你只是問了非常具體的教程?

無論如何,爲什麼HQL是第二選擇。恕我直言,Criteria Helper只能在構建動態查詢時使用(例如,根據用戶輸入添加條件)。如果你有一個靜態查詢,我會建議HQL。它也應該更快。也看看NamedQuery。

0

這裏是Hibernate的條件查詢的文檔: http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/querycriteria.html

具體來說,你想看看在限制類(http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/criterion/Restrictions.html)和靜態方法,如()和ILIKE(),後者把手病例不敏感的比較。我也傾向於針對靜態查詢的HQL,但我有時也看到了使靜態元素可配置的好處,特別是對於調試。因此,我可以將查詢存儲在配置文件中,使用動態查詢方法,因此即使應用程序通常運行相同的查詢,也可以輕鬆對其進行更改以進行測試。

肅然,

凱文