【问题标题】:OpenJPA How to use WHERE condition on collection with join fetch?OpenJPA 如何在集合中使用 WHERE 条件与连接提取?
【发布时间】:2012-07-18 06:40:12
【问题描述】:

我在 WebSphere Application Server 8 上使用 OpenJPA 2.1。 我有一个像这样的双向 oneToMay 关系:

@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;

}

现在我想在 table2 上选择整个 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)

如何在集合上使用带有条件的 JOIN FETCH?

最好的问候投票

【问题讨论】:

    标签: join jpql openjpa


    【解决方案1】:

    根据 JPA 2.0 规范,不支持这样的构造,并且看起来 OpenJPA 也不提供作为供应商扩展的功能:

    FETCH JOIN 子句右侧引用的关联 必须是属于作为返回的实体的关联 查询的结果。不允许指定标识 FETCH 右侧引用的实体的变量 JOIN 子句,因此引用隐式获取的实体 不能出现在查询的其他地方。

    在您的情况下,这意味着您无法定义 t2,因此您无法在 WHERE 子句中使用它。

    【讨论】:

    • 对不起,我只是忘了编辑我的查询。我声明了 t1 但我得到了同样的异常
    • 我相应地修改了答案。
    • 好吧,那很糟糕:/还有其他方法吗?
    • 不是我所知道的。假设查询是在事务中执行的——通过在查询后立即迭代 table2List 来接触 Tabl2 实例是典型的解决方法,以保证它们被获取。
    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 2015-10-26
    • 1970-01-01
    相关资源
    最近更新 更多