2017-06-15 71 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