簡體   English   中英

如何使用 jpa 規范對 2 個表的連接進行搜索?

[英]How to search using jpa specifications on a join of 2 tables?

我有 2 個表,即 table1 和 table2。 我想要一個 JPA 規范來搜索兩個表的連接,即 table1 上的一些字段和 table2 上的一些字段。 2 個表如下所示:

@Entity
@Table(name = "table1")
public class Table1 {
    @Id
    @Column(name = "SID1", nullable = false)
    private Long sid1;

    @Column(name = "field1")
    private Long field1;

    @Column(name = "field2")
    private String field2;

    @Column(name = "SID2", nullable = false)
    private Long sid2;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "SID2")
    private Table2 t2;
}

@Entity
@Table(name = "table2")
public class Table2 {
    @Id
    @Column(name = "SID2", nullable = false)
    private Long sid2;

    @Column(name = "field01")
    private Long field01;

    @Column(name = "field02")
    private String field02;
}

我想構建一個規范及其 SpecificationBuilde,但不知道如何從 root.get() 引用表 2 的字段。 例如

public static Specification<Table1> hasField01(final String field) {
        return (root, query, cb) -> cb.equal(root.get("t2.field01"), field); //is this correct??
    }

我探索了分別對每個表進行 2 次查詢的想法,但這變得很麻煩。 您的幫助將不勝感激。

如果您的目標是在加入 Table1 時搜索 Table2.field01,您可以使用以下 JPQL 查詢:

SELECT 
    t1
FROM 
    Table1 t1 
    LEFT JOIN t1.t2 t2
WHERE 
    t2.field01 = :field

這將 select Table1 但只有與 Table2 連接的記錄的 field01 等於指定的參數。 ":field" 必須作為參數從外部提供給查詢,如下所示:

public class Table1DAO {
    // ...
    public List<Table1> findByField01(Long field01)
    {
        try {
            List<Table1> result = entityManager
                .createQuery("SELECT t1 FROM  Table1 t1  LEFT JOIN t1.t2 t2 WHERE t2.field01 = :field", Table1.class)
                .setParameter("field", field01)
                .getResultList();

            return result;
        }
        catch (NoResultException e)
        {
            return null;
        }
        catch (Exception e)
        {
            throw e;
        }
    }
}

您可以 select 兩個表中的所有字段或字段的任意組合,但您的查詢無法將此類結果轉換為 Table1,您需要從返回的數組中讀取它們:

List<Map<String, Object>> results = (List<Map<String, Object>>) query.getResultList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM