【发布时间】:2014-04-03 14:31:32
【问题描述】:
目前,我有一个UserDao 类,它使用CriteriaQuery 创建一个查询,例如,使用它的ID 从数据库中检索User 的一个实例(我们称该方法为findById)。到目前为止,它非常简单,而且效果很好。
不过,我还有一个GenericDao,它是由UserDao 扩展的。在userDao.findById 返回结果之前,它会将criteriaQuery 传递给GenericDao,因此我可以对criteriaQuery 添加一些限制。
例子:
public class GenericDao
{
private EntityManager entityManager;
protected Object executeCriteriaQuery(CriteriaQuery criteriaQuery)
{
return entityManager.createQuery(prepareQuery(criteriaQuery)).getSingleResult();
}
private CriteriaQuery prepareQuery(CriteriaQuery criteriaQuery)
{
// add restrictions to criteriaQuery
Predicate predicate = ... // some predicate which will be appended to the already formed criteriaQuery
criteriaQuery.where(criteriaBuilder.and(criteriaQuery.getRestriction(), predicate));
return criteriaQuery;
}
}
public class UserDao extends GenericDao
{
public User findById(String id)
{
CriteriaQuery query = criteriaBuilder.createQuery(entityClass);
Root<P> entity = query.from(entityClass);
query.select(entity);
query.where(criteriaBuilder.equal(entity.get("id"), id.toUpperCase()));
return executeCriteriaQuery(query);
}
}
问题是:在扩展我的GenericDao 的 DAO 中构建的查询可能包含JOIN。我想向 JOIN 添加一个谓词,该谓词添加到 criteriaQuery。
据我所知,我可以使用From.getJoins() 在查询中检索JOINs。但是,根据该方法的 Javadoc:
返回已从此绑定类型进行的连接。如果没有从此绑定类型进行连接,则返回空集。 对集合的修改不会影响查询。
返回:由这种类型组成的连接
如何在criteriaQuery 的JOIN 子句中添加谓词?
【问题讨论】:
-
是什么阻止您在具体的 DAO 类中构建/修改条件查询,然后使用
GenericDao执行这些查询?这种方法可以更好地解耦职责并将业务逻辑转移到具体的 DAO,即GenericDao可以是具有抽象prepareQuery方法的抽象类,目前还不是完全通用的。 -
@wypieprz 我希望能够在查询中添加适用于每个 DAO 中构建的每个查询的子句,这就是为什么我想在我的
GenericDao中实现它的原因。如果我在每个班级都这样做,那么每个 DAO 中的每个查询都会使用相同的代码。
标签: java jpa-2.0 criteria criteria-api