#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. Точка, с которой нужно начинать, всегда одна и та же: чтение документации.