2017-06-15 3 views
2

私は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); 
    } 
} 

選択クエリの作成:

選択... ABCからインナーがabc_subscriptionを...内部結合が上...どこsubscripti2_.SubscriptionId =サブスクリプションsubscripti2_に参加BP_?

...:この場所には何かがあります。

私はabcとサブスクリプションに参加していますが、クエリでは_で区切られたもう1つのエンティティを作成しています。すなわちabc_subscription。

私が間違っていることは何ですか?前もって感謝します。

+0

私はこのクエリと間違って何、それを得ることはありませんか?あなたは他の何かを期待していますか?あなたは名前についてただ気にしていますか? –

+0

私は期待しているクエリです:select ... from abc bp_内側joinサブスクリプションsubscript2_ on ...ここでsubscripti2_.SubscriptionId =? – Akkave

+0

なぜこれがこのようになると思いますか?あなたは 'ManyToMany'関係を使用していますので、デフォルトでは結合テーブル' Abc_subscription'で表されます。 –

答えて

1

@ManyToManyは、エンティティ間にリンクテーブルがあるシナリオで使用する必要があります。

@JoinTableが指定されていない場合、永続性プロバイダが使用するデフォルトのリンクテーブルは、両方のエンティティを「_」で区切って連結したものになります。 これに加えて、リンクテーブルの想定列名が指定されていない場合、エンティティクラスで定義されたフィールド名は@Idとなります。

は仕様に従うと、それに応じて自分の状況に適応するようにしてください:ManyToMany javadoc