我知道要休眠。 我有一個SQL語句HQL查詢需要很長時間才能執行
SELECT VERSION_ID,D_BEGIN,D_END,
(SELECT NAME FROM zvit where ZVIT_ID=version.ZVIT_ID) as name
FROM version
where VERSION_ID in
(SELECT term.VERSION_ID FROM term
where term.PERIOD_MONTH= :periodMonth and term.PERIOD_TYPE= :periodType and term.PERIOD_YEAR= :periodYear)
order by 1 ;
我試着用個createCriteria和HQL來實現它。
DetachedCriteria subQuery = DetachedCriteria.forClass(TermData.class)
.add(Restrictions.eq("periodmonth", periodMonth))
.add(Restrictions.eq("periodtype", periodType))
.add(Restrictions.eq("periodyear", periodYear))
.setProjection(Projections.projectionList()
.add(Projections.property("versionId.versionId"))
);
Criteria versionCriteria = session.createCriteria(VersionData.class)
.addOrder(Order.asc("versionId"))
.add(Subqueries.propertyIn("versionId", subQuery))
.createAlias("zvitId", "zvitId", org.hibernate.sql.JoinType.INNER_JOIN)
.setProjection(Projections.projectionList()
.add(Projections.property("versionId"))
.add(Projections.property("dbegin"))
.add(Projections.property("dend"))
.add(Projections.property("zvitId.name"), "name")
);
HQL:
Query query = session.createQuery(""
+ "from VersionData as version "
// + "inner join version.zvitId as zvit "
+ "where version.versionId in "
+ "(select term.versionId from TermData as term "
+ "where term.periodmonth= :periodmonth and term.periodtype= :periodtype and term.periodyear= :periodyear)");
的問題是,這個HQL需要10倍更長的時間來執行。並做了很多不必要的查詢。我試圖與評論對象來做這件事,它改善了一點,但仍然工程5的時間比個createCriteria查詢時間更長,除了我得到VersionData和ZvitData對象我不能這樣做皈依
List<VersionData> queryResult = query.list();
。這似乎不是一個問題,但我仍然不明白爲什麼我沒有收到只是VersionData對象。 但是還有一個更重要的問題是有沒有什麼辦法可以改善這個HQL語句,以便與mysql或createCriteria查詢同時執行。
VersionData defenition
@Entity
@Table(name = "version")
public class VersionData implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 7355281418627668744L;
@Id
@Column(name="VERSION_ID")
private String versionId;
/**
* user dbegin
*/
@Column(name = "D_BEGIN")
@Type(type = "date")
private Date dbegin;
/** user dend */
@Column(name = "D_END")
@Type(type = "date")
private Date dend;
/**
* user zvitId
*/
@ManyToOne
@JoinColumn(name="ZVIT_ID")
private ZvitData zvitId;
@OneToMany(targetEntity=TermData.class, mappedBy = "versionId", cascade=javax.persistence.CascadeType.ALL, fetch=FetchType.LAZY)
private List<TermData> terms;
//getters, setters, hashcode, equals
}
親愛的,發佈您的VersionData POJO定義。 –
已添加版本數據 – Evgen
對於每個VersionData,您都有一個TermData的列表,因此您必須在此添加TermData的定義。這是主要查詢深度的導入。 –