我已经尝试了几个小时才能做到这一点,但我找不到解决方案。
我有一个表“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();
}
答案 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