2016-12-27 42 views
1

我需要选择链接租借实体的所有字段return_date为空的客户记录。下面的SQL查询工作:带有内部连接的HQL查询并检查NULL失败

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"); 
+0

我已经更新了我的回答你的情况下加入了。试着告诉我,如果没关系。如果不是,请发布错误 –

回答

0

您的查询不起作用,因为您尝试将客户与集合(租赁)关联,但要在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"); 
+0

第一个不适用,第二个不起作用。 –

+0

请发布第二个查询的错误?第一,为什么不适用? –

+0

你的第二个查询甚至不会击中'BREAKPOINT A'。确实奇怪.. –