Почему Jpa не выдает запрос JOIN при использовании @Fetch (FetchMode.JOIN) - PullRequest
0 голосов
/ 20 марта 2020

У меня есть две сущности: Программа и Тенденции. Это отношения между ними.

В тренде:

@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "Trending2Program", foreignKey = @ForeignKey(name = 
"FK_Trending_Program"))
private Program program;

В программе:

@OneToMany(mappedBy = "program")
private List<Trending> trendingList;

Репозиторий:

@Repository
public interface TrendingRepository extends JpaRepository <Trending, Integer> {
 List<Trending>findByDateBetween(LocalDate startDate, LocalDate endDate);
}

При выполнении findById из класса обслуживания, тогда hibernate создаст необходимое соединение:

 from
    Trending tre0_ 
 left outer join
    Program program1_ 
        on tre0_.trending2Program=program1_.Id

Но при выполнении findByDateBetween hibernate создаст два отдельных запроса:

Hibernate: 
select
    ……
from
    Trending tre0_ 
where
    tre0_.Date between ? and ?

Hibernate: 
select
 …….
from
    Program program0_ 
where
    program0_.Id=?

Чем отличается? Что я делаю не так и как я могу правильно настроить hibernate, чтобы он создавал необходимое объединение при использовании findByDateBetween

Спасибо

1 Ответ

0 голосов
/ 20 марта 2020

Хорошо, даже если вы объявили @ManyToOne(fetch = FetchType.LAZY), оно полностью отключилось, когда вы указали стратегию извлечения как FetchMode.JOIN. С помощью стратегии соединения Hibernate всегда будет пытаться выполнить соединение, не обращая внимания на тип выборки. Таким образом, программа не будет загружаться с отложенной загрузкой.

Вы должны использовать @Fetch(FetchMode.SELECT) или просто удалить @Fetch, потому что FetchMode.SELECT является значением по умолчанию.

Если вы сделаете это, до тех пор, пока вы не делаете trendingObj.getProgram(), вы всегда должны получать один сгенерированный выбор.

Если вам нужна программа в одном go, то вам, вероятно, нужно go для быстрого извлечения, то есть сохранить FetchMode.JOIN и удалите fetch = FetchType.LAZY. ИЛИ вы можете просто написать JPQL с аннотацией @Query.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...