Самый простой способ выбора в модели с использованием JPQL

#sql #hibernate #jpa #playframework #jpql

#sql #переход в спящий режим #jpa #playframework #jpql

Вопрос:

У меня есть база данных hibernate с тремя моделями:

 Article - which has is part of multiple categories (EDIT).
Category - which contains articles, and is part of an App
App - which has different categories
  

Я хочу выбрать все статьи, которые имеют категорию определенного приложения.
Итак, я пытаюсь создать что-то вроде:

 find("ANY categories.app = ?", app).fetch();
  

Что-то подобное сработало для меня с CoreData, но, очевидно, не с JPA, и я, похоже, не могу найти, как это сделать.

Редактировать: Для уточнения: в статьях:

     @ManyToMany
    public List<Category> categories;
  

в категории:

     @ManyToOne
    public App app;

    @ManyToMany(mappedBy = "categories")
    public List<Article> articles;
  

в приложении:

     @OneToMany(mappedBy = "app")
    public List<Category> categories;
  

Ответ №1:

 select a from Article a where a.category.app = ?
  

Читать http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#queryhql

Комментарии:

1. Когда я пытаюсь это сделать, я получаю: java.lang. Исключение IllegalArgumentException: org.hibernate. Исключение QueryException: незаконная попытка разыменования коллекции [article0_.id.categories] со ссылкой на свойство элемента [приложение] [ВЫБЕРИТЕ из моделей. Статья a ГДЕ a.LastUpdate > ? И .categories.app = ?]. (категории вместо категории, поскольку это отношение «многие ко многим»)

2. Итак, статья имеет много категорий, верно? Вы сказали, что категория содержит несколько статей. Итак, это ассоциация ManyToMany. В этом случае вам нужно явное объединение: выберите a из статьи a внутреннее объединение a.категории c, где c.app = ?. Это очень хорошо объяснено в документации, на которую я ссылался. Прочитайте это, вот как вы узнаете.

3. Меня пробрала дрожь, когда вы упомянули внутреннее объединение, плохие воспоминания из прошлого… Спасибо! Я больше не мог вспомнить это и не знал, с чего начать. Иногда я делаю что-то «старомодным» способом, который я использовал для кодирования SQL, что слишком дорого. Итак, спасибо, что указали, что это так, это работает! Документ очень полезен! (и извините, что не ясно изложил суть дела)

4. Точка, с которой нужно начинать, всегда одна и та же: чтение документации.