2017-05-18 12 views
1

私は2つのテーブル "table1"と "table2"を持っています。 table1の各行には、table2に複数の行があります。データを取得するには、私はその後、私はこれは私のようにテーブル1から行のリストが表示されます。このJPAの条件付きwhere節

@Transactional 
public interface Table1Repository extends JpaRepository<Table1, Integer> { 

    Page<Table1> findByCompanyId(Integer companyId,Pageable pageable); 

} 

のようにリポジトリを作成している以下のクラス

@Entity 
@EntityListeners(AuditingEntityListener.class) 
@Table(name = "table1", schema = "dbo") 
public class Table1 extends BaseDomain{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer vendorId; 
    private String name; 
    private Integer companyId; 
    private String details; 

    @OneToMany(mappedBy = "table1",cascade = CascadeType.ALL) 
    @NotFound(action = NotFoundAction.IGNORE) 
    private Set<Table2> table2; 

// getter and setter for above 
} 

@Entity 
    @EntityListeners(AuditingEntityListener.class) 
    @Table(name = "table2", schema = "dbo") 
    public class Table2 extends BaseDomain{ 
     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     private Integer id; 
     private Integer cityId; 
     private Integer companyId; 
     @OneToOne 
     @JoinColumn(name = "vendorId") 
     @JsonIgnore 
     private Table1 table1; 

    // getter and setter for above 
    } 

を作成しましたcompanyIdと対応するvendorIdを持つ行のリストごとにTable2にあります。

これまでの実装は正常に動作しています。

応答は、現在、私は、入力として企業IDを取ってい

{ 
    "content": [ 
    { 
     "vendorId": 23, 
     "name": "vendorname", 
     "details": details, 
     "table2": [ 
       { 
        "id" :1, 
       "cityId":1, 
       }, 
        "id" :2, 
        "cityId" : 3 
       ] 
    }, 
    {....} 
] 
} 

で、上記応答を与えます。今私はcityIdを入力としても使いたいと思っています。したがって、table2出力には、指定されたcityIdの詳細のみが含まれている必要があります。

どのように私はそれを達成することができますか?私はtable1とtable2の別のモデルを作成したくありません。

+1

、第二のエンティティに、私はあなたの代わりに '@ OneToOne' –

+0

使用CriteriaBuilder CBのManyToOne' @'を使用してCBを使用して接続されているすべての三つのフィールドでCriteriaQueryのquery.whereを作成すべきだと思います。等しい。 – btreport

+0

申し訳ありません私はJPAが初めてです。もっと説明できますか?いくつかのサンプルコードが役に立ちます。 –

答えて

1
Page<Table1> findByCompanyIdAndTable2_CityId(Integer companyId, Integer cityId, Pageable pageable); 

このメソッドはcityIdによってフェッチされます。アンダースコア(_)はネストされたフィールドを参照します。しかし、これが機能するには、Table2を熱心に取得する必要があります。答えの前に

@OneToMany(mappedBy = "table1",cascade = CascadeType.ALL, fetch=FetchType.EAGER) 
+0

私はまた会社のデータでフィルタリングする必要があります –

+0

ありがとうございます。これを試してみてください –

+0

あなたのデータモデルにcompanyIdフィールドがありませんか? – pvpkiran