2016-12-27 3 views
1

Мне нужно выбрать все записи клиентов, которые связали объект аренды, у которого есть поле return_date, которое равно null. Следующий 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'. Действительно странно .. –