[英]HQL inner join and date query
我已經嘗試了幾個小時才能解決這個問題,但是我找不到解決方案。
我有一個表“ Orders”和一個表“ Events”,其中eventId是Orders中的外鍵。 我有一個訂單列表,現在只按事件過濾,但現在我也希望它按日期過濾,所以我想我要更改查詢。
我正在嘗試加入事件表,但似乎無法正常工作。 這是查詢:
@Transactional
@SuppressWarnings("unchecked")
public List<Orders> getOrders(Integer id){
// java.util.Date utilDate = new SimpleDateFormat("yyyy-MM-dd").parse(test);
// java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
hql = "FROM Orders o join o.eventId e where o.eventId=" +id ;
query = getCurrentSession().createQuery(hql);
return (List<Orders>) query.list();
}
我認為您必須刪除join o.eventId e
因為在編寫時:
where o.eventId = ...
HQL隱式轉換聯接條件(在Order和Event屬性之間)和where條件。
因此,請嘗試以下操作:
@Transactional
@SuppressWarnings("unchecked")
public List<Orders> getOrders(Integer id){
hql = "FROM Orders o where o.eventId=" +id ;
query = getCurrentSession().createQuery(hql);
return (List<Orders>) query.list();
}
您的代碼中有太多問題可能會出錯。
首先,顯然您在使用Hibernate是錯誤的。 您需要考慮實體而不是表。 而且,從您的HQL,顯然您的實體映射是錯誤的。
它應該看起來像:
@Entity @Table(name="Orders")
class Order {
@Id
private Integer id;
@ManyToOne(...) @JoinColumn(name="eventId")
private Event event;
}
@Entity @Table(name="Events")
class Order {
@Id
private Integer id;
@Temporal(...)
private Date fooDate;
}
您的初始HQL應該如下所示:
from Order o where o.event.id = :eventid
你應該通過傳遞參數
Query query = ....;
query.setParameter("eventid", id);
用自己的方式構造HQL可以輕松地允許sql注入
如果您正確地映射了日期字段,那么按日期查詢就沒什么困難了:
Query q = session.createQuery("from Order o where o.event.fooDate = :foodate");
q.setParameter("foodate", dateParam);
q.list();
您的代碼的另一個問題顯然是放置@Transactional
不適當位置
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.