Java: 使用条件创建内部联接
Java: create a inner join using criteria
我很难搜索有关如何使用内部联接创建条件查询的好示例。
我已经创建了下面的查询,这将是我想要对条件执行的操作。
SELECT DISTINCT *
FROM DT_DOCUMENT as document
INNER JOIN DT_TRANSLATION as translation
ON translation.language_id IN(1, 2, 3)
WHERE document.id = translation.document_id
AND document.title LIKE '%Document%';
Return 所有标题为文档的文档和 ID 为 1,2 和 3 的翻译。
我能够使用条件创建 2 个不同的 select,但我无法在这些表之间生成内部联接来统一代码。
翻译条件查询
CriteriaQuery<Translation> translationQuery = builder.createQuery(Translation.class);
Root<Translation> translation = translationQuery.from(Translation.class);
List<Long> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
ids.add(3);
Predicate idPredicate = translation.in(ids);
translationQuery.where(idPredicate);
translationQuery.distinct(true);
TypedQuery<Translation> query = this.entityManager.createQuery(translationQuery);
query.getResultList();
Return id 为 1,2 和 3 的所有翻译;
文件条件查询
CriteriaQuery<Document> documentQuery = builder.createQuery(Document.class);
Root<Document> document = documentQuery.from(Document.class);
Predicate titlePredicate = builder.like(document.get("title"), "%Document%");
documentQuery.where(titlePredicate);
TypedQuery<Document> query = this.entityManager.createQuery(documentQuery);
query.getResultList();
Return 标题为文档的所有文档。
有什么建议吗?谢谢
经过长时间的搜索,我制定了这个解决方案,统一了 2 个查询并使用了内连接:
//query creation
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Document> documentQuery = builder.createQuery(Document.class);
Root<Document> root = documentQuery.from(Document.class);
//parameter list for where
List<Predicate> predicateList = new ArrayList<Predicate>();
//doing the join: pass the translations reference (list <Translations) that exists in the document model.
Join<Document, Translation> documentTranslationJoin = root.join("translations");
//I get the ids of the languages associated with the translations found in the join
Path<Long> translationLanguageId = documentTranslationJoin.get("language");
//I passed the ids of the languages that I want to find translations
List<Long> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
ids.add(3);
//considers languages of translations
Predicate predicateTranslationId = builder.isTrue(translationLanguageId.in(ids));
//I passed the ids of the languages that will be the where looking for the translations that have the ids of the languages that I want to see
predicateList.add(predicateTranslationId);
//considers title of document
Predicate titlePredicate = builder.like(root.get("title"),"%documento%");
predicateList.add(titlePredicate);
//where
Predicate[] predicates = new Predicate[predicateList.size()];
predicateList.toArray(predicates);
documentQuery.where(predicates);
//execution of the query with its parameters
TypedQuery<Document> query = this.entityManager.createQuery(documentQuery);
query.setFirstResult(0);
query.setMaxResults(8);
//results
List<Document> documents = query.getResultList();
我很难搜索有关如何使用内部联接创建条件查询的好示例。 我已经创建了下面的查询,这将是我想要对条件执行的操作。
SELECT DISTINCT *
FROM DT_DOCUMENT as document
INNER JOIN DT_TRANSLATION as translation
ON translation.language_id IN(1, 2, 3)
WHERE document.id = translation.document_id
AND document.title LIKE '%Document%';
Return 所有标题为文档的文档和 ID 为 1,2 和 3 的翻译。
我能够使用条件创建 2 个不同的 select,但我无法在这些表之间生成内部联接来统一代码。
翻译条件查询
CriteriaQuery<Translation> translationQuery = builder.createQuery(Translation.class);
Root<Translation> translation = translationQuery.from(Translation.class);
List<Long> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
ids.add(3);
Predicate idPredicate = translation.in(ids);
translationQuery.where(idPredicate);
translationQuery.distinct(true);
TypedQuery<Translation> query = this.entityManager.createQuery(translationQuery);
query.getResultList();
Return id 为 1,2 和 3 的所有翻译;
文件条件查询
CriteriaQuery<Document> documentQuery = builder.createQuery(Document.class);
Root<Document> document = documentQuery.from(Document.class);
Predicate titlePredicate = builder.like(document.get("title"), "%Document%");
documentQuery.where(titlePredicate);
TypedQuery<Document> query = this.entityManager.createQuery(documentQuery);
query.getResultList();
Return 标题为文档的所有文档。
有什么建议吗?谢谢
经过长时间的搜索,我制定了这个解决方案,统一了 2 个查询并使用了内连接:
//query creation
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Document> documentQuery = builder.createQuery(Document.class);
Root<Document> root = documentQuery.from(Document.class);
//parameter list for where
List<Predicate> predicateList = new ArrayList<Predicate>();
//doing the join: pass the translations reference (list <Translations) that exists in the document model.
Join<Document, Translation> documentTranslationJoin = root.join("translations");
//I get the ids of the languages associated with the translations found in the join
Path<Long> translationLanguageId = documentTranslationJoin.get("language");
//I passed the ids of the languages that I want to find translations
List<Long> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
ids.add(3);
//considers languages of translations
Predicate predicateTranslationId = builder.isTrue(translationLanguageId.in(ids));
//I passed the ids of the languages that will be the where looking for the translations that have the ids of the languages that I want to see
predicateList.add(predicateTranslationId);
//considers title of document
Predicate titlePredicate = builder.like(root.get("title"),"%documento%");
predicateList.add(titlePredicate);
//where
Predicate[] predicates = new Predicate[predicateList.size()];
predicateList.toArray(predicates);
documentQuery.where(predicates);
//execution of the query with its parameters
TypedQuery<Document> query = this.entityManager.createQuery(documentQuery);
query.setFirstResult(0);
query.setMaxResults(8);
//results
List<Document> documents = query.getResultList();