Проблема с Hibernate / JPA Query и категориями - PullRequest
0 голосов
/ 18 февраля 2011

У меня есть модель данных Hibernate / JPA, которая позволяет размещать объекты (MyObj) в различных категориях (MyCategory). Каждая категория может иметь 0 или более подкатегорий, а категории, которым вместо этого не назначена классификация (MyClassification). Модель данных выглядит примерно так:

public class MyObj {

    …

    protected MyCategory category = null;

    …
}

public class MyCategory {

    …

    protected MyClassification classification=null;

    protected List<MyCategory> childCategories=null;

    protected MyCategory parentCategory=null;

    …

}

public class MyClassification {

    …

}

Я бы хотел иметь возможность запрашивать экземпляры MyObj на основе классификации, категории или подкатегории. Например, если у меня есть 3 классификации (classA, classB и classC) и 6 категорий (например, categoryA1, categoryA2, categoryB1 и т. Д., Где имя соответствует классификации), и у каждой из этих категорий есть 3 подкатегории (например, subcatA1, subcatA2, subcatA3, subcatB1 и т. д.) Я хотел бы выполнить такие запросы:

  • Все экземпляры MyObj в классификационном классе A (независимо от категории или подкатегории)
  • Все экземпляры MyObj в категории categoryA1 (независимо от подкатегории)

Я создал пару NamedQueries, которые, как я думал, позволят это сделать. Они отлично работают для случаев, когда экземпляр MyObj был назначен подкатегории. Однако, если я помещаю экземпляр MyObj в категорию (без подкатегории) и выполняю запрос на основе класса, я его не вижу. Я вижу только экземпляры MyObj, которые находятся внутри подкатегории. Мои запросы выглядят так:

MyObj.findByClass = "SELECT DISTINCT o FROM MyObj o WHERE (o.category.classification = :classification OR o.category.parentCategory.classification = :classification)"

MyObj.findByCategory = "SELECT DISTINCT o FROM MyObj o WHERE (o.category = :category OR o.category.parentCategory = :category)"

Может кто-нибудь сказать мне, где ошибка в моей логике для этих запросов? Есть ли лучший способ сделать то, что я хочу?

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

Проблема с вашим запросом состоит в том, что o.category.parentCategory записывается как inner join category cat on cat.id=o.parent_category, и если parentCategory равно NULL, вы не получите никакого результата.

Таким образом, точечная навигация подразумевает внутреннююобъединяет, что вызывает проблемы с OR заявлениями.Вы должны использовать явные запросы LEFT JOINs или UNION.

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

from(QCategory.category)
.where(QCategory.category.classification.eq(classification).or(QCategory.category.left().parentCategory().left().classification.eq(classification))
.listDisticnt(QCategory.category)

ВЫБРАТЬ ОТЛИЧИЕ o ОТ MyObj o ГДЕ (ocategory.classification =: классификация ИЛИ o.category.parentCategory.classification =: классификация) "

0 голосов
/ 18 февраля 2011

Я думаю, что вам не хватает «классификации» в первом запросе после ИЛИ:

MyObj.findByClass = "SELECT DISTINCT o FROM MyObj o WHERE (o.category.classification = :classification OR o.category.parentCategory.classification = :classification)"

С другой стороны, мне кажется, что обход графа объектов проще, чем выдача HQL-запросов

...