2012-07-19 57 views
0

我使用的OpenJPA 2.1 WebSphere Application Server上8 我有一個雙向oneToMay關係是這樣的:OpenJPA如何通過聯合提取使用WHERE條件?

@Entity(name = "table1") 
public class Table1 { 
    @Id 
    @Column(columnDefinition = "DATE") 
    private Date date; 
    @OneToMany(mappedBy = "date", targetEntity = Table2.class, fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) 
    private List<Table2> table2List; 
} 

@Entity(name = "table2") 
public class Tabl2{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "fk_date", nullable = false) 
    private Table1 table1; 

    @Column(name = "value", nullable = false, columnDefinition = "INT") 
    private int value; 

} 

現在我想對錶2的條件這樣選擇整個table1的實體:

TypedQuery<WeekBean> q = em.createQuery(
    "SELECT t1 from table1 t1 JOIN FETCH t1.table2List t2 WHERE t2.value = :value", 
    t1.class); 

但是,這並不工作,東陽我得到一個ArgumentException:

Exception in thread "main" <openjpa-2.1.1-SNAPSHOT-r422266:1141200 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: " Encountered "f" at character 50, but expected [",", ".", "GROUP", "HAVING", "INNER", "JOIN", "LEFT", "ORDER", "WHERE", <EOF>]." 
    at org.apache.openjpa.kernel.jpql.JPQLParser.parse(JPQLParser.java:51) 
    at org.apache.openjpa.kernel.ExpressionStoreQuery.newCompilation(ExpressionStoreQuery.java:154) 
    at org.apache.openjpa.datacache.QueryCacheStoreQuery.newCompilation(QueryCacheStoreQuery.java:262) 
    at org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:672) 
    at org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:654) 
    at org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:620) 
    at org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:682) 
    at org.apache.openjpa.kernel.QueryImpl.compile(QueryImpl.java:589) 
    at org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:996) 
    at com.ibm.ws.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:107) 
    at com.ibm.ws.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:86) 
    at com.ibm.ws.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:34) 
    at org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:974) 

如何使用一個連接抓取w ^關於收集的條件?

此致Veote

回答

2

根據JPA 2.0說明書中這樣的不支持的構建體,並且看起來像OpenJPA中也沒有提供的功能提供商擴展:

通過的右側引用的關聯FETCH JOIN子句 必須是屬於作爲查詢結果 而返回的實體的關聯。不允許爲FETCH JOIN子句的右側引用的實體指定變量的標識 變量,因此對查詢中其他位置不會出現對隱式提取實體 的引用。

在你的情況下,這意味着你不能定義t2,因此你不能在WHERE子句中使用它。

+0

對不起,我只忘了編輯我的查詢。我宣佈t1,但我得到相同的異常 – veote 2012-07-19 08:20:25

+0

我相應地修改了答案。 – 2012-07-19 08:28:34

+0

好吧,那很糟糕:/是否有另一種方式來做到這一點? – veote 2012-07-19 08:44:11