HQL-поиск в дочернем наборе с ключевым словом IN - PullRequest
2 голосов
/ 03 мая 2011

Я действительно не могу найти достаточно документации по ключевому слову hibernate IN, когда применяется при поиске в коллекции какого-либо объекта. У меня странная проблема, у меня есть запрос hql:

    FROM Contact co, IN (co.categories)categories WHERE categories.name = ?

В я ожидал список контактов конечно. Но с этим что-то не так, потому что он не возвращает список объектов Contact, а список Object [] ????? Это синтаксис или это совершенно неправильно ??

Вот детали карт:

     <set lazy="false" name="categories" table="ContactCategory">
        <key column="id" foreign-key="fk_contact_category" />
        <many-to-many class="Category" column="catid"
            foreign-key="fk_contact_category2" />
    </set>

     <class name="Category">

    <id column="catid" name="Id" type="long">
        <generator class="sequence" />
    </id>
    <property length="50" name="name" type="string" />  
</class>

Важное замечание: этот запрос выполняется с помощью построителя запросов. Это распечатка одного из сгенерированных запросов, где он не работает Очень странно, что - я получаю правильное количество объектов в этом списке, я проверяю базу данных и число корректно с заданными параметрами, но я не получаю объекты Contact, но некоторые массивы объектов в списке.

Ценю всю помощь

Ответы [ 4 ]

4 голосов
/ 03 мая 2011

Вам нужно добавить SELECT co

, чтобы ваш запрос был SELECT co FROM Contact co, IN (co.categories)categories WHERE categories.name = ?

. SELECT co необходим, чтобы сообщить Hibernate, какой элемент он должен вернуть в строке набора результатов..


SELECT co FROM Contact co LEFT JOIN co.categories cat WHERE cat.name = ? До сих пор я видел ключевое слово IN только в предложении Where -.В Stuff, как это,

FROM catagories cat WHERE cat.name IN ('HALLO', 'WORLD')

1 голос
/ 04 мая 2011

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

List<Object[]> results = // code to fetch your query ;
// just the first, or you can print every entry with a outer loop
Object[] firstObject = results.get(0);
for (Object o : firstObject) {
  System.out.println(o.getClass() + " - " + o);
}

Я предполагаю, что hibernate выводит либо объект Contact и отдельный список категорий, либо возвращает столбцы, возвращаемые из запроса, в качестве примитивных оболочек. В любом случае, проблема, похоже, в том, что Hibernate не смог выяснить, что вы ожидали получить из списка столбцов, которые были возвращены СУБД. Во втором запросе вы сузили его до псевдонима определенного типа, который вы хотели, чтобы все работало, как ожидалось.

1 голос
/ 04 мая 2011

Я не люблю отвечать на мой вопрос, не понимая, почему этот SELECT необходим, но это работает как шарм. Если кто-то объяснит мне причину, я с удовольствием проголосую за его ответ.

  **SELECT co** FROM Contact co, IN (co.categories)categories WHERE categories.name = ?

Спасибо всем

0 голосов
/ 27 апреля 2013

Это сработало для меня в Grails 2.1.4 HQL

Task.executeQuery ("выберите задачу из задачи, присоединитесь к тегу task.tags, где tag.name = 'duplicate'")

Предполагая, что сущность Task.groovy имеет

static hasMany = [tags: Tag]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...