Hibernate - как быстро загружать ленивые поля? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть объект с несколькими ленивыми полями -

@Entity 
public class Account implements Serializable {
    @OneToMany(mappedBy = "accountIdfk", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Address> addresses;
    .....
}

В некоторых сценариях ios мне нужно быстро загружать адреса. Обычно мы вызываем запрос ниже, чтобы получить объект -

dataStore.get().type(clazz).pk(id).execute();

Есть ли способ передать любой дополнительный параметр или что-то в приведенном выше запросе для загрузки адресов во время выполнения?

Ответы [ 2 ]

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

В дополнение к решениям в @ SternK answer , вы можете использовать Spring Data JPA @ Query , @ NamedQuery или @ NamedNativeQuery .

Вот пример @NamedQuery:

@Entity 
@NamedQuery(name = "Account.findAccountWithAddress",
        query = "SELECT a FROM Account a LEFT JOIN FETCH a.addresses AS addr WHERE a.id = :id")
public class Account implements Serializable {
    @OneToMany(mappedBy = "accountIdfk", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Address> addresses;
    .....
}

@Repository
public interface UserRepository extends JpaRepository<Account, Long> {

    Optional<Account> findAccountWithAddress(Long id);
}
0 голосов
/ 26 мая 2020

Вы можете использовать динамический c выборку через запросы (JOIN FETCH):

Account account = entityManager.createQuery(
    "select a " +
    "from Account a " +
    "left join fetch a.addresses " +
    "where a.id = :id",
    Account.class)
.setParameter( "id", id)
.getSingleResult();

Также вы можете использовать динамическую c выборку через граф объектов JPA . Более подробную информацию вы можете найти по той же ссылке.

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