首页 > 解决方案 > 使用桥接表时的 HQL 查询?

问题描述

我正在使用桥接表而不创建中间桥接类。地址有一个addressStatus字段。我正在尝试使用 addressStatus 查询用户 > UserAddressBridge > 地址。

@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 查询以使用桥接类,因为它不是物理实体对象。这就是我试图在用户地址是传递的 Id 的地方拉用户的方式。但是,由于我们使用上述语法“导航”到中间桥表 - 我如何编写 JPA 查询?还是我别无选择,只能求助于本机查询?

公共接口 UserRepository 扩展 PagingAndSortingRepository<User, Long> {

@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);
}

标签: hibernatejpa

解决方案


您不需要定义查询。spring-data-jpa可以根据方法名称自动生成它。

    public interface UserRepository 
                     extends PagingAndSortingRepository<User, Long> {

      public Page<User> findByAddressesAddressId(Long addressId,
                                                 Pageable pageable);
    }

推荐阅读