【问题标题】:HQL query with inner join and check for NULL fails具有内部连接和检查 NULL 的 HQL 查询失败
【发布时间】:2017-05-12 03:03:10
【问题描述】:

我需要选择所有已链接租赁实体的客户记录,该实体的字段return_date 为空。以下 SQL 查询有效:

 SELECT
     c.customer_id, r.rental_id
     FROM
     Customer c
     INNER JOIN rental as r
     ON (c.customer_id = r.customer_id)
     WHERE r.return_date IS NULL;

为什么跟随 HQL 不起作用:

Query query = session.createQuery("from Customer customer " +
                        "inner join customer.rentals as r " +
                        "where r.return_date is null");

上下文:

@Override
    public List<Customer> getFilteredCustomers(String filter) {
        Session session = null;
        List<Customer> customers = new ArrayList<>();
            try {
                session = sessionFactory.openSession();
                Query query = session.createQuery("select customer from Customer customer " +
                        "join customer.rentals r " +
                        "where r.return_date is null");
                customers = (List<Customer>)query.list(); // << BREAKPOINT A
            }catch (Exception e){
                System.out.println(e);
            }finally {
                if (session!=null) session.close();
            }
        return customers;
    }

解决方案:

显然,HQL 中使用的字段名称必须取自模型类,而不是数据库...

Query query = session.createQuery("select c " +
                        " from Rental r, Customer c " +
                        " where r.customer = c " +
                        " and r.returnDate is null");

【问题讨论】:

  • 在您添加上下文后,我已经更新了我的答案。试着告诉我是否可以。如果没有,请发布错误

标签: spring hibernate hql


【解决方案1】:

您的查询不起作用,因为您尝试将客户与集合(租赁)链接,但要在 return_date 访问,您必须指向集合的 i-esime 元素,以便您可以反转查询,从 RENTAL 开始对象(我希望你已经映射了它)

试试这个:

Query query = session.createQuery("select c " +
           " from Rental r, Customer c " +
           " where r.customer_id = c.customer_id " +
           " and r.return_date is null");

【讨论】:

  • 第一个不适用,第二个不起作用。
  • 请贴出第二次查询的错误?第一,为什么不适用?
  • 但是你有出租对象吗?
猜你喜欢
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 2011-12-16
相关资源
最近更新 更多