Java: создать внутреннее соединение, используя критерии - PullRequest
1 голос
/ 22 марта 2019

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

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%';

Вернуть все документы с заголовком Документ и переводы с идентификаторами 1,2 и 3.

Мне удалось создать 2 разных выбора с критериями, но я не могу сгенерировать внутреннее соединение между этими таблицами для унификации кода.

Запрос критериев перевода

        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();

Вернуть все переводы с 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();

Вернуть все документы с заголовком Документ.

Любой совет? Благодаря.

1 Ответ

0 голосов
/ 04 апреля 2019

После долгих поисков я сделал это решение, объединив два запроса и используя внутреннее соединение:

    //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();
...