![](/img/trans.png)
[英]Spring JPA using Specifications and CriteriaQuery on Joint Tables
[英]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.