HQL内部联接和日期查询

时间:2016-11-14 14:08:16

标签: java hibernate hql

我已经尝试了几个小时才能做到这一点,但我找不到解决方案。

我有一个表“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();
    }

2 个答案:

答案 0 :(得分:0)

我认为你必须删除join o.eventId e,因为当你写:

where o.eventId = ...

HQL隐式转换你在连接条件中的位置(在Order和Event属性之间)和where condition。

所以,试试这个:

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

答案 1 :(得分: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