#hibernate #jpa
#переход в спящий режим #jpa
Вопрос:
Я использую таблицу bridge без создания промежуточного класса Bridge. Адрес имеет addressStatus
поле. Пытаюсь запросить User> UserAddressBridge> Адрес, используя addressStatus.
@Table(name = "user")
public class User {
..
@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.DETACH})
@JoinTable(
name = "user_address",
joinColumns = { @JoinColumn(name = "user_id")},
inverseJoinColumns = { @JoinColumn(name = "address_id")}
)
@JsonIgnore
private final List<Address> addresses = new ArrayList<Address>();
@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.DETACH})
@JoinTable(
name = "reports",
joinColumns = { @JoinColumn(name = "user_id")},
inverseJoinColumns = { @JoinColumn(name = "reports_id")}
)
@JsonIgnore
private final List<Reports> reports = new ArrayList<Reports>();
}
Я не могу понять, как написать JPA-запрос для использования класса bridge, поскольку он не является объектом физической сущности. Вот как я пытался привлечь пользователей, где адрес пользователя — это идентификатор, который передается вместе. Но поскольку мы используем приведенный выше синтаксис для «перехода» к промежуточной таблице перехода — как я могу написать запрос JPA? Или у меня нет другого выбора, кроме как прибегнуть к собственному запросу?
пользовательский репозиторий открытого интерфейса расширяет PagingAndSortingRepository<Пользователь, длинный> {
@Query(value = "SELECT user FROM User address, <<UserAddress address>> WHERE address.addressId = :addressId")
public Page<User> findCasesByStatus(Pageable pageable, @Param("addressId") Long addressId);
}
*** РЕДАКТИРОВАТЬ: Спасибо за предложение. Это сработало **** Мне просто нужно было использовать JPA для правильного построения имени моего метода, как показано ниже. _ имело значение.
public AddressRepository extends CrudRepository<Address, Long> {
public Page<User> findByAddresses_AddressStatus(Pageable pageable
Byte addressStatus);
}
Ответ №1:
Вам не нужно определять запрос. spring-data-jpa
можно автоматически сгенерировать его на основе имени метода.
public interface UserRepository
extends PagingAndSortingRepository<User, Long> {
public Page<User> findByAddressesAddressId(Long addressId,
Pageable pageable);
}
Комментарии:
1. Как он узнает, что нужно перейти к таблице адресов?
2. Адрес и ассоциация пользователей хранятся в
user_address
таблице, вы указали это через@JoinTable
, и именно так он узнает, как находить пользователей по идентификатору адреса3. вы хотите сказать,
findByAddressesAddressId
что имя используется для обнаружения соединения? если я добавлю addressStatus вместо id — сработает ли это? addressStatus находится в таблице адресов …4. Спасибо — я получил ответ из ваших предложений.
5. Если вы можете сохранять и обновлять, это означает, что jpa понимает все ваши таблицы. Теперь попробуйте мыслить в терминах ваших сущностей, то есть вы запрашиваете свои сущности, а не таблицы. docs.spring.io/spring-data/jpa/docs/2.3.3.RELEASE/reference /… . и docs.spring.io/spring-data/jpa/docs/2.3.3.RELEASE/reference /… . Что касается вашего
_
предложения, оно будет необходимо только при возникновении конфликта иspring-data-jpa
жалоб. Но даже если он не жалуется, вы можете добавить_
для удобства чтения