簡體   English   中英

HQL內部聯接和日期查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM