【问题标题】:HQL inner join and date queryHQL 内连接和日期查询
【发布时间】:2016-11-14 14:08:16
【问题描述】:

我已经尝试了几个小时来解决这个问题,但我找不到解决方案。

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

【问题讨论】:

  • 您注释掉的代码显示了您如何为日期声明一个变量,但我没有看到任何可以告诉我们您在查询中使用该日期时尝试了什么,或者什么时候发生了什么你试过了;所以很难说出了什么问题。也就是说,我可以建议使用查询参数比将查询片段与变量值连接起来更好,尤其是在日期的情况下,使用参数出错的方法更少。
  • 我注释掉了日期,因为这个查询之前没有尝试加入事件表。我这样做是为了看看我是否正确加入.. 这是有效的: hql = "FROM Orders o where o.eventId=" +id ;但这不起作用: hql = "FROM Orders o join o.eventId e where o.eventId=" +id ;
  • join o.eventId e 在我看来是错误的。您似乎正在尝试将 Orders 加入到 Orders 中的列而不是另一个表。
  • 当我这样做时: hql = "FROM Orders o join Event e where o.eventId=" +id ;我得到:休眠:加入的预期路径!内连接例外
  • 也许发布您的两个实体类,以便人们可以看到它们的结构

标签: java hibernate hql


【解决方案1】:

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

where o.eventId = ...

HQL 隐式转换您的 where in join 条件(在 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();
}

【讨论】:

    【解决方案2】:

    您的代码中有很多问题可能会出错。

    首先,显然你使用 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的地方不合适

    【讨论】:

      猜你喜欢
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      相关资源
      最近更新 更多