亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何通過 JPA 從連接的第二個表中檢索特定行

如何通過 JPA 從連接的第二個表中檢索特定行

aluckdog 2022-12-15 11:00:28
我有兩張表,一張是客戶,另一張是客戶部門。Customer 與 customerDepartment 具有一對多的關系。我有一個特定的搜索條件,我需要在其中搜索部門名稱,如果它等于我需要檢索包括客戶在內的所有客戶部門行。這就是我試圖得到的結果public interface CustomerRepository extends JpaRepository<Customer,Integer>{    @Query(value="select DISTINCT c from Customer c left join c.custDept cd where cd.deptName like %?1% ")    Page<Customer> findByName(String name, Pageable pageable);}顧客@Entity@Table(name="customer")public class Customer implements Serializable{    private static final long serialVersionUID = 1L;    @Id    @Column(name= "customer_no",updatable = false, nullable = false)    @GeneratedValue(strategy = GenerationType.SEQUENCE)    private int customerNo;    @Column(name= "customer_name")    private String customerName;    @Column(name= "industry")    private String industry;     @JsonManagedReference     @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL,      fetch=FetchType.LAZY)     private Set<CustomerDepartment> custDept;}客戶部:@Entity@Table(name = "customer_department")public class CustomerDepartment implements Serializable{    private static final long serialVersionUID = 1L;    @Id    @Column(name = "dept_id",updatable = false, nullable = false)    @GeneratedValue(strategy = GenerationType.SEQUENCE)    private int depId;    @Column(name = "dept_name")    private String deptName;    @Column(name = "primary_contact")    private String primaryContact;      @JsonBackReference      @ManyToOne(fetch=FetchType.LAZY)      @JoinColumn(name = "customer_no", nullable = false)      private Customer customer;}如果這在 JPA 中是不可能的,我有什么辦法可以做到這一點。謝謝您的幫助
查看完整描述

1 回答

?
元芳怎么了

TA貢獻1798條經驗 獲得超7個贊

是的,我是這么認為的。我評論說“我認為你的查詢沒問題,但是當結果被編組為 JSON 時,所有相關的部門都會被檢索。你應該在編組之前查看你的 sql 輸出并調試和檢查查詢結果,看看是否是案子。” 我繼續玩弄它,我或多或少是正確的。

問題是您沒有custDept使用查詢獲取集合,因此當客戶為您的其余響應編組時,將執行附加查詢以獲取值,而附加查詢只查詢所有內容。

2019-05-25 14:29:35.566 DEBUG 63900 --- [nio-8080-exec-2] org.hibernate.SQL:選擇不同的 customer0_.customer_no 作為 customer1_0_,customer0_.customer_name 作為 customer2_0_,customer0_.industry 作為 industry3_0_ 來自客戶 customer0_ left outer join customer_department custdept1_ on customer0_.customer_no=custdept1_.customer_no where custdept1_.dept_name like ? 限制 ?

2019-05-25 14:29:35.653 DEBUG 63900 --- [nio-8080-exec-2] org.hibernate.SQL:選擇 custdept0_.customer_no 作為 customer4_1_0_,custdept0_.dept_id 作為 dept_id1_1_0_,custdept0_.dept_id 作為 dept_1_1_1_1_1 .customer_no 作為 customer4_1_1_,custdept0_.dept_name 作為 dept_nam2_1_1_,custdept0_.primary_contact 作為 primary_3_1_1_ 來自 customer_department custdept0_ where custdept0_.customer_no=?

如果您只想要查詢提供的內容,則需要進行提取,以便在custDept編組之前初始化集合。您的查詢還存在其他問題。你應該使用一個 sql 參數:deptName并且你應該聲明它,你應該提供一個countQuery因為你要返回一個Page.

public interface CustomerRepository extends JpaRepository<Customer,Integer>{

    @Query(value="select DISTINCT c from Customer c left join fetch c.custDept cd where cd.deptName like %:deptName% ", 

            countQuery = "select count ( DISTINCT c ) from Customer c left join c.custDept cd where cd.deptName like %:deptName% ")

    public Page<Customer> findByName(@Param("deptName") String deptName, Pageable pageable);

為我工作?,F在只執行了原始查詢,結果是正確的。


{

"content": [

    {

        "customerNo": 1,

        "custDept": [

            {

                "deptName": "it"

            }

        ]

    }

],

最后請注意,最好根據 spring 文檔在您的實體中使用Integerfor 。@Id


查看完整回答
反對 回復 2022-12-15
  • 1 回答
  • 0 關注
  • 85 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號