将CriteriaQuery JOIN添加到CriteriaQuery后进行修改

时间:2014-04-03 14:31:32

标签: java jpa-2.0 criteria criteria-api

目前,我有一个UserDao类,它使用CriteriaQuery创建查询,例如使用其ID从数据库中检索User的实例(让我们调用该方法{{ 1}})。到目前为止,它非常简单,并且工作正常。

但是,我还有一个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); } } 的DAO中构建的查询可能包含GenericDao。我想在添加到JOIN的{​​{1}}添加谓词 从我可以看到,我可以使用From.getJoins()检索查询中的JOIN。但是,根据该方法的Javadoc:

  

返回从此绑定类型创建的连接。如果未从此绑定类型进行连接,则返回空集。 对该集的修改不会影响查询。

     

返回:此类型的连接

如何在criteriaQuery中的JOIN子句中添加谓词?

1 个答案:

答案 0 :(得分:0)

过了一段时间,我决定要对这个特定问题实施不同的方法。由于我无法找到有关如何执行此操作的任何选项,因此我尝试在JPA实现级别上解决此问题。由于我使用了Hibernate,因此我使用了Hibernate filters。对于Eclipselink用户:您可以使用Eclipselink的Multi tenancy功能。

不幸的是,我还没能找到更高级别的解决方案,所以如果我要切换实现,我仍然需要为此编写一个新的实现。另一方面,我可能不会定期切换到新的实现,因此可能不会成为一个问题。