2015-01-14 2 views
0

У меня есть следующий HQL запрос:Выравнивание по левому краю выборки с условием не удается

return entityManager().createQuery(
    "SELECT page FROM ProjectPage page" 
    + " left join fetch page.categorySet as category    " 
    + " where page.id = :id " 
    + " and category.parentCategory is null " 
    + " and (category.status != :status_val) " 
    ,ProjectPage.class).setParameter("id", id) 
    .setParameter("status_val", 1).getSingleResult(); 

проблема заключается в том, что условия в которых положение не удается, например, запрос возвращает категории объектов, состояние 1 и категории объектов чья родительская категория не является нулевой, хотя я указал это ограничение, как указано выше!

+0

Можете ли вы предоставить нам пример скрипта SQL? (http://sqlfiddle.com) – Smutje

+0

@Smutje это не SQL. Это HQL (Hibernate Query Language). –

+0

Если вы оставили внешнее соединение, не выполняйте условия внешней таблицы в предложении WHERE, переместите их в предложение ON. (Если в предложении WHERE это больше не ВЗАИМОДЕЙШИЙ ПРИСОЕДИНЯЙТЕ, просто обычный JOIN.) – jarlh

ответ

2

Если вы ожидаете, что этот запрос вернет объект ProjectPage с categorySet, отфильтрованный на основе where условий, тогда ваши ожидания не соответствуют действительности. Если экземпляр ProjectPage с данным идентификатором содержит любой категории, которые передают условия условия where, он будет возвращен в целом объекте. Это по дизайну и необходимо из-за базовых механизмов, кэширования и т. Д. Если вам нужны объекты категории, которые удовлетворяют некоторым условиям, вам придется написать отдельный запрос для этого.

+0

Извините, не могли бы вы объяснить больше, что вы подразумеваете под целым объектом? и если я хочу применить вышеуказанные условия для каждого объекта категорииSet, что мне делать? –

+0

Вам нужно будет запросить объекты 'Category', а не' ProjectPage'. Что-то вроде 'select c из категории c, где и c.projectPage.id =: id'. Единственный способ, которым я знаю, будет делать то, что вы ожидаете, использовать [Hibernate filters] (https://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/filters.html). –

+0

ОК, но я до сих пор не понял причину проблемы, пожалуйста, объясните мне –

Смежные вопросы