Запрос HQL при использовании таблицы Bridge?

#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 жалоб. Но даже если он не жалуется, вы можете добавить _ для удобства чтения