2017-06-15 74 views
2

我有两个实体类和存储库看起来像下面。我正在做jpql select查询。JPQL多对多选择查询

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查询生成:

选择......从ABC BP_内部联接abc_subscription ... ...上哪里subscripti2_.SubscriptionId =内加入认购subscripti2_?

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

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

任何想法我做错了什么?提前致谢。

+0

我不明白,这有什么错此查询?你期望别的吗?你只是在烦扰这些名字吗? –

+0

我希望查询:select ... from abc bp_ inner join订阅subscripti2_ on ...其中subscripti2_.SubscriptionId =? – Akkave

+0

你为什么期望它是这样的?您正在使用'ManyToMany'关系,因此默认情况下它将使用连接表'Abc_subscription'来表示。 –

回答

1

@ManyToMany应该在实体之间存在链接表的情况下使用。

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

尽量遵循相应的规范和适应您的情况:ManyToMany javadoc