OpenJPA如何使用join fetch在集合上的WHERE条件?
我在WebSphereApplicationServer8上使用OpenJPA2.1。 我有这样一个双向的oneToMay关系:OpenJPA如何使用join fetch在集合上的WHERE条件?,join,jpql,openjpa,Join,Jpql,Openjpa,我在WebSphereApplicationServer8上使用OpenJPA2.1。 我有这样一个双向的oneToMay关系: @Entity(name = "table1") public class Table1 { @Id @Column(columnDefinition = "DATE") private Date date; @OneToMany(mappedBy = "date", targetEntity = Table2.class, fetc
@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;
}
TypedQuery<WeekBean> q = em.createQuery(
"SELECT t1 from table1 t1 JOIN FETCH t1.table2List t2 WHERE t2.value = :value",
t1.class);
@实体(name=“table1”)
公共课表1{
@身份证
@列(columnDefinition=“日期”)
私人日期;
@OneToMany(mappedBy=“date”,targetEntity=Table2.class,fetch=FetchType.LAZY,cascade=CascadeType.PERSIST)
私人名单表2;
}
@实体(名称=“表2”)
公共类表格2{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@多通(级联=级联类型.ALL)
@JoinColumn(name=“fk_date”,null=false)
私人附表1附表1;
@列(name=“value”,nullable=false,columnDefinition=“INT”)
私有int值;
}
现在,我想选择整个table1实体,并在table2上设置如下条件:
@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;
}
TypedQuery<WeekBean> q = em.createQuery(
"SELECT t1 from table1 t1 JOIN FETCH t1.table2List t2 WHERE t2.value = :value",
t1.class);
TypedQuery q=em.createQuery(
“从table1 t1连接获取t1.Table2列表t2中选择t1,其中t2.value=:value”,
t1类);
但这不起作用,因为我有一个例外:
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)
线程“main”org.apache.openjpa.persistence.ArgumentException中的异常:“在字符50处遇到了“f”,但应为[”、“、”、“、”、“、组”、“HAVING”、“INNER”、“JOIN”、“LEFT”、“ORDER”、“WHERE”、]”
位于org.apache.openjpa.kernel.jpql.JPQLParser.parse(JPQLParser.java:51)
位于org.apache.openjpa.kernel.ExpressionStoreQuery.newcommpilation(ExpressionStoreQuery.java:154)
在org.apache.openjpa.datacache.QueryCacheStoreQuery.newcommpilation(QueryCacheStoreQuery.java:262)
位于org.apache.openjpa.kernel.QueryImpl.newcommpilation(QueryImpl.java:672)
位于org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:654)
位于org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:620)
位于org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:682)
位于org.apache.openjpa.kernel.QueryImpl.compile(QueryImpl.java:589)
位于org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:996)
位于com.ibm.ws.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:107)
位于com.ibm.ws.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:86)
位于com.ibm.ws.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:34)
位于org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:974)
如何在集合上使用具有条件的联接获取
向Veote致意根据JPA 2.0规范,这种构造不受支持,而且看起来OpenJPA也不提供作为供应商扩展的功能: FETCH JOIN子句右侧引用的关联 必须是属于作为实体返回的实体的关联 查询的结果。不允许指定标识 获取右侧引用的实体的变量 JOIN子句,从而引用隐式获取的实体 不能出现在查询的其他位置
在您的情况下,这意味着您不能定义
t2
,因此您不能在WHERE子句中使用它。根据JPA 2.0规范,这样的构造不受支持,而且看起来OpenJPA也不提供作为供应商扩展的功能:
FETCH JOIN子句右侧引用的关联
必须是属于作为实体返回的实体的关联
查询的结果。不允许指定标识
获取右侧引用的实体的变量
JOIN子句,从而引用隐式获取的实体
不能出现在查询的其他位置
在您的情况下,这意味着您不能定义
t2
,因此您不能在WHERE子句中使用它。很抱歉,我只是忘了编辑我的查询。我声明了t1,但我得到了相同的例外,我相应地修改了答案。好吧,那很糟糕:/还有其他方法可以做到这一点吗?没有我所知道的任何方法。假设查询是在事务处理Tabl2实例中执行的,在查询之后立即在table2List上迭代,这是典型的解决方法,可以保证它们被提取。我声明了t1,但我得到了相同的例外,我相应地修改了答案。好吧,那很糟糕:/还有其他方法可以做到这一点吗?没有我所知道的任何方法。假设查询是在事务处理Tabl2实例中执行的,在查询之后立即迭代table2List,这是保证获取它们的典型解决方法。