2016-11-14 80 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