2016-11-14 73 views
0

我一直在嘗試幾個小時才能得到這個權利,但我無法找到解決方案。HQL內部加入和日期查詢

我有一個表「訂單」和一個表「事件」,其中eventId是訂單中的外鍵。我有一個訂單列表,現在只是過濾事件,但現在我也希望它過濾日期,所以我想我會改變查詢。

我想加入事件表,但我似乎無法得到它的工作。 這是查詢:

@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(); 
    } 
+0

你註釋掉的不妥之處代碼顯示瞭如何爲日期聲明一個變量,但我沒有看到任何告訴我們在查詢中使用該日期的事情,或者當您嘗試使用該日期時發生的事情;所以說出了什麼問題有點難。也就是說,我可以建議使用查詢參數比將查詢片段與變量的值連接起來更好,並且在日期情況下,特別是使用參數錯誤的方法更少。 –

+0

我註釋掉了日期,因爲此查詢之前沒有嘗試加入Event表。我做了這個,看看我是否正確連接.. 這是工作: hql =「從訂單o其中o.eventId =」+ ID; 但是這不是工作: hql =「FROM訂單o加入o.eventId e其中o.eventId =」+ id; – 1oneSquared

+0

'加入o.eventId e'看起來不對我。它看起來像你試圖將'Orders'連接到'Orders'中的列而不是另一個表中。 – JonK

回答

0

我認爲你必須刪除join o.eventId e因爲當你寫:

where o.eventId = ... 

HQL隱含的變換和WHERE條件(Order和事件屬性之間)的其中連接條件。

所以,試試這個:

@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(); 
} 
0

有在你的代碼這麼多的問題,可能會出錯。

首先,顯然你使用的是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