JPQL有多对多选择查询

时间:2017-06-15 07:42:53

标签: java hibernate jpa jpql

我有两个实体类和存储库看起来如下。我正在制作jpql select query。

Subscription.java

@Entity
@Table(name="Subscription")
public class Subscription implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="SubscriptionId", nullable=false)
    private Integer subscriptionId;

    @Column(name="BaseProductId", nullable=false)
    private Integer baseProductId;

    @ManyToMany(fetch = FetchType.LAZY, mappedBy="subscription")
    private List<Abc> abc;
}

Abc.java

@Entity
@Table(name="abc")
public class Abc implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="SubscriptionId", nullable=false)
    private Integer id;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinColumn(name="id", referencedColumnName="BaseProductId", insertable = false, updatable = false, nullable = false)
    private List<Subscription> subscription;
}

AbcRepository.java

@Repository
public interface AbcRepository extends JpaRepository<Abc, Integer> {

    @Query(value="SELECT bpp FROM Abc bpp JOIN bpp.subscription s WHERE s.subscriptionId = ?1")
        public List<Abc> findBppm(Integer a);
    }
}

选择查询生成:

select ... from abc bp_ inner join abc_subscription ... inner join订阅subscripti2_ on ...其中subscripti2_.SubscriptionId =?

...: - 它在这个地方有点东西。

虽然我正在加入abc和订阅,但在查询hibernate中创建一个由_分隔的实体。即abc_subscription。

知道我做错了什么吗?提前谢谢。

2 个答案:

答案 0 :(得分:2)

在实体之间存在链接表的情况下,应使用

@ManyToMany

如果未指定@JoinTable,则持久性提供程序使用的默认链接表将是由“_”分隔的两个实体的串联。 最重要的是,f未指定链接表中的假定列名称将是实体类中定义的@Id字段名称。

尝试遵循规范并相应调整您的情况:ManyToMany javadoc

答案 1 :(得分:0)

通常,请避免使用“多对多关系列表”,因为这可能会导致从任何一个实体中删除字段时出现问题。 而是使用Sets private Set <> abc = new HashSet <>();