当前,我有一个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。我想将谓词添加到添加到JOINcriteriaQuery中。
从我所看到的,我可以使用From.getJoins()在查询中检索JOIN。但是,根据Javadoc的方法:


  返回从此绑定类型进行的联接。如果尚未从此绑定类型进行任何联接,则返回空集。对集合的修改不会影响查询。
  
  返回:使用该类型的联接


如何在我的JOINcriteriaQuery子句中添加谓词?

最佳答案

一段时间后,我决定针对此特定问题实施另一种方法。由于找不到如何执行此操作的任何选项,因此尝试在JPA实施级别上解决它。由于我使用的是Hibernate,因此我使用的是Hibernate filters。对于Eclipselink用户:您可以使用Eclipselink的Multi tenancy功能。

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

关于java - 将CriteriaQuery JOIN添加到CriteriaQuery之后,对其进行修改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22840829/

10-10 02:36