簡體   English   中英

JPA CriteriaBuilder離開表的外部聯接沒有關系嗎?

[英]JPA CriteriaBuilder left outer join for table with no relations?

最初,我需要使用JPA CriteraiBuilder為以下SQL編寫代碼:

SELECT ve.col_1,
  (SELECT vm.col_4
  FROM table2 vm
  WHERE vm.col_2  = ve.col_2
  AND vm.col_3 = ve.col_3
  ) as col_a
FROM table1 ve;

但是我了解到,不可能在select子句中添加子查詢。 因此,我將查詢更改為使用左外部聯接,如下所示。

SELECT ve.col_1,
  vm.col_4 as col_a
FROM table1 ve,
  table2 vm
WHERE 
vm.col_2 (+)    = ve.col_2 
AND vm.col_3 (+) = ve.col_3;

現在,table1和table2沒有使用外鍵的直接關系。 相應的JPA實體如下所示:

Table1.java ->

@Column(name = "COL_1")
private String col_1;

@Column(name = "COL_2")
private String col_2;

@Column(name = "COL_3")
private String col_3;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumns({
    @JoinColumn(name="COL_2"),
    @JoinColumn(name="COL_3")
})
private Table2 table2;


Table2.java ->

@Column(name = "COL_4")
private String col_4;

@Column(name = "COL_2")
private String col_2;

@Column(name = "COL_3")
private String col_3;

我的代碼如下:

final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

final CriteriaQuery<SearchTO> query = criteriaBuilder.createQuery(
        SearchTO.class);
Root<Table1> root = query.from(Table1.class);

final Join<Table1, Table2> joinTable2 = root.join(Table1_.table2,
        JoinType.LEFT);

然后我嘗試使用以下方法獲取值:

joinTable2.get(Table2_.col_4)

然后現在我得到錯誤為:

A Foreign key refering com.Table2 from com.Table1 has the wrong number of column

Table2大約有6列帶有@Id的注釋,我無法更改將其更改為只有兩列帶有@Id的注釋。

請告訴我:

  • 如果可以使用CriteriaBuilder為我的方法1(在select子句中的子查詢)編寫代碼。

  • 如果那不可能,我如何實現方法2所述的左外部聯接。請注意,Table2沒有Table1的任何引用。

請注意,我使用的是普通的JPA API。 DB是Oracle11g。 JDK版本是1.7。

對於方法1:您可以為條件查詢編寫子查詢

Subquery<Entity1> subquery = cq.subquery( Entity1.class );
    Root fromSubQuery = subquery.from( Entity1.class );
    subquery.select( cb.max( fromSubQuery.get( "startDate" ) ) );
    subquery.where( cb.equal( fromSubQuery.get( "xyzId" ), fromRootOfParentQuery.get( "xyzId" ) ) );

用作:

Root<Entity2> entity2 = cq.from( Entity2.class );
Predicate maxDatePredicate = cb.and( cb.equal( entyty2.get( "startDate" ), subquery ) );

對於方法2:除了要在兩個實體之間建立左連接關系之外,別無其他方法。 您可以為沒有getter和setter的關系定義私有變量,並使用該變量設置左聯接。 然后將謂詞添加到criteriaBuilder

暫無
暫無

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

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