Как избежать левого внешнего соединения при поиске по встроенному идентификатору объекта в Spring Data JPA - PullRequest
0 голосов
/ 05 мая 2020

У меня есть два класса сущностей:

class One {
    Long id;

    <Other properties>

    @ManyToOne
    Two two;
}

class Two {
    Long id;

    <Other properties>
}

Теперь, в OneRepository, у меня есть метод:

One findByIdAndTwoId(Long oneId, Long twoId);

Когда этот метод вызывается, запрос отправляется в база данных:

    select
        <properties>
    from
        one one0_ 
    left outer join
        two two1_ 
            on one0_.two_id=two1_.id 
    where
        and one0_.id=? 
        and two1_.id=?

В то время как я ожидаю, что это будет иметь форму:

    select
        <properties>
    from
        one one0_ 
    where
        and one0_.id=? 
        and one0_.two_id=?

Есть ли способ сделать это? Пожалуйста, помогите.

EDIT:

Если я использую запрос критериев, как указано ниже, в результирующем запросе нет предложения соединения.

        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<One> cq = cb.createQuery(One.class);
        Root<One> oneRoot = cq.from(One.class);
        cq.select(oneRoot).where(
                cb.equal(oneRoot.get("id"), oneId),
                cb.equal(oneRoot.get("two").get("id"), twoId)
        );
        TypedQuery<One> query = entityManager.createQuery(cq);
        return query.getSingleResult();

1 Ответ

0 голосов
/ 05 мая 2020

Использовать собственный запрос JPA

Используя аннотацию @Query, вы можете выполнять собственные запросы, установив для флага nativeQuery значение true.

@Query(value = "select * from one o where o.id=?1 and o.two_id=?2", nativeQuery = true)
One findByIdAndTwoId(Long oneId, Long twoId);
...