2013-02-04 28 views
1

如何使用額外的ON子句參數加入? 我有一個SQL:JPA CriteriaBuilder加入額外的ON子句參數(謂詞)

select * from Address address left outer join AddressLine line 
       on line.id = address.lineId AND line.type = 'MA' 
where address.id = 1; 

我有代碼:從數據庫

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<AddressResult> query = cb.createQuery(AddressResult.class); 
Root<Address> r = query.from(Address.class); 
Join<Address, AddressLineMA >linesMA= r.join(Address_.linesMajor, JoinType.LEFT); 

獲取數據。 預期該查詢不工作我得到這樣的SQL:

select * from Address address left outer join AddressLine line 
       on line.id = address.lineId 
    where address.id = 1; 

和line.type =「馬」丟失。有人知道如何解決這個問題嗎?

我AddressLineMA.class看起來是這樣的:

@Entity 
@DiscriminatorValue(value = "MA") 
public class AddressLineMA extends AddressLine { 

} 
@Entity 
@Table(name = "AddressLine") 
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING) 
public abstract class AddressLine { 
    private Long id; 
    private String type; 
    private String line; 
} 

回答

4

JPA查詢總是默認返回所有的子類。因此,如果只需要AddressLineMA的實例,則必須將您的查詢和關係更改爲AddressLineMA而不是繼承根類AddressLine。

如果有要排除AddressLineMA的其他子類,那麼你可以使用TYPE運營商加入到JPA 2.0:

query.where(cb.equal(linesMA.type(), package.AddressLineMA.class)); 

不幸的是,將它添加到ON子句僅在尚不支持待發布JPA 2.1規範:

linesMA.on(cb.equal(linesMA.type(), package.AddressLineMA.class));