Запрос на объект, где объединены с другим, который имеет определенное значение? - PullRequest
0 голосов
/ 11 августа 2011

У меня есть база данных с 3 таблицами.

LANGUAGE
id

ARTICLE
-id

ARTICLE_DETAIL
-id
-articleId
-languageId

Мне нужно получить статью из базы данных, но только если она содержит подробности статьи на определенном языке.Сегодня у меня есть запрос в нативном MySQL с использованием коалессии, и это прекрасно работает.Но теперь я хочу сделать то же самое в EJB3.Я пробовал много разных вещей, но пока безуспешно.Я не очень хорошо знаком с сущностями в EJB3, поэтому, если кто-нибудь может помочь мне встать на правильный путь, я был бы признателен.

Вот более или менее то, что я пытался до сих пор:

Integer id = 543; // id of an article
Integer languageId = 2; // id of a language

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Article> cq = cb.createQuery(Article.class);
Root<Article> article = cq.from(Article.class);
Join<Article, ArticleDetail> details = article.join(Article_.articleDetailList);

// I think this is where I go wrong
cq.where(article.get(Article_.id).in(id)).where(details.get(ArticleDetail_.languageId).in(languageId));

TypedQuery<Article> q = em.createQuery(cq);
Article result = (Article) q.getSingleResult();
return result;

1 Ответ

0 голосов
/ 12 августа 2011

Это сделал работу:

...
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Article> cq = cb.createQuery(Article.class);
Root<Article> article = cq.from(Article.class);
Join<Article, ArticleDetail> details = article.join(Article_.articleDetailList);
Join<ArticleDetail, Language> language = details.join(ArticleDetail_.languageId);
cq.where(cb.and(
  cb.equal(article.get(Article_.id), id),
  cb.equal(language.get(Language_.id), languageId)));
...
...