Spring Boot JPA:如何编写获取被ObjectB关联的ObjectA的Repository方法
解决方案
首先纠正你实体类中的一个错误:多对多关联应该使用@JoinTable而非@JoinColumn,@JoinColumn适用于一对多/多对一场景。修改后的ObjectB关联字段如下:
@ManyToMany @JoinTable( name = "objectB_objectAs", // 指定中间表名 joinColumns = @JoinColumn(name = "objectB_id"), // 当前实体在中间表的外键 inverseJoinColumns = @JoinColumn(name = "refObjectA_id") // 关联实体在中间表的外键 ) private List<ObjectA> objectAs; // 变量名改为小写开头,符合Java编码规范
接下来提供三种无需原生SQL的实现方式:
1. Spring Data JPA方法命名查询
直接在ObjectARepository中定义符合命名规则的方法,Spring Data会自动生成对应的JPQL:
public interface ObjectARepository extends JpaRepository<ObjectA, Integer> { List<ObjectA> findByObjectBsIsNotNull(); }
使用该方法需要在ObjectA中添加反向关联:
// 在ObjectA类中添加 @ManyToMany(mappedBy = "objectAs") private List<ObjectB> objectBs;
2. JPQL查询(无需反向关联)
如果不想添加反向关联,可以在ObjectARepository中使用@Query注解编写JPQL:
public interface ObjectARepository extends JpaRepository<ObjectA, Integer> { @Query("SELECT DISTINCT a FROM ObjectB b JOIN b.objectAs a") List<ObjectA> findAllAssociatedWithObjectB(); }
3. 业务层提取关联数据
也可以先查询所有ObjectB,再提取关联的ObjectA并去重:
// 在业务逻辑代码中实现 List<ObjectB> allObjectBs = objectBRepository.findAll(); Set<ObjectA> associatedObjectAs = new HashSet<>(); for (ObjectB b : allObjectBs) { associatedObjectAs.addAll(b.getObjectAs()); } List<ObjectA> result = new ArrayList<>(associatedObjectAs);
这种方式适合数据量不大的场景,数据量大时推荐前两种方式。
内容的提问来源于stack exchange,提问作者Cucumberbatch
相关产品推荐
相关产品推荐

