我基本上是第一次使用 Criteria API。这是关于抽象通用构建器的查询:
public TypedQuery<T> newQuery( Manager<?,T> manager )
{
CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
Class<T> genericClass = ( Class<T> ) ( ( ParameterizedType ) manager.getClass().getGenericSuperclass() ).getActualTypeArguments()[1];
CriteriaQuery<T> criteriaQuery = builder.createQuery( genericClass );
Root<T> root = criteriaQuery.from( genericClass );
...
}
电话criteriaQuery.from( genericClass );
生成 SQLINNER JOIN
默认情况下在实体上找到的所有关系。这是一个问题,因为每个关系都为空(DBNULL
或者不使用外键且具有无效引用的数据库)这些实体将在结果列表中丢失,从而有效地产生错误的搜索结果。
可以在这里找到一个例子:JPA Criteria查询Path.get left join是否可以 https://stackoverflow.com/q/10145074/396732
对于此类/方法实例化的查询,我希望发生的是实体上的所有关系,这里genericClass
,映射为optional = true
@ManyToOne( FetchType.EAGER, optional = true )
@JoinColumn( name = "CLOSE_USER_ID", referencedColumnName = "USER_ID" )
private User closer;
生成 SQLLEFT (OUTER) JOIN
代替INNER JOIN
.
Question:
有标准的 JPQ 方法来完成这个任务吗?如果是这样,怎么办?
PS:通常没有办法事先知道具体类型,所以我能够实现我需要的唯一方法是使用某种元模型并手动生成连接(我想避免)。
我们正在使用 EclipseLink 2.3