【问题标题】:Hibernate CriteriaBuilder with two parametersHibernate CriteriaBuilder 有两个参数
【发布时间】:2017-10-27 02:11:21
【问题描述】:

我在 Hibernate 5.2.1 中使用 Java8,在 MySQL 中使用 JPA2。

我有以下完美运行的查询:

    final EntityManagerFactory entityManagerFactory = entityManager.getEntityManagerFactory();
    final CriteriaBuilder criteriaBuilder = entityManagerFactory.getCriteriaBuilder();
    CriteriaQuery<Rating> criteria = criteriaBuilder.createQuery(Rating.class);
    Root<Rating> root = criteria.from(Rating.class);
    ParameterExpression<Job> paramJob = criteriaBuilder.parameter(Job.class);

    criteria.select(root).where(criteriaBuilder.equal(root.get("job"), paramJob));

如您所见,查询有一个参数paramJob。我想添加第二个参数:

    ParameterExpression<Person> paramPerson = criteriaBuilder.parameter(Person.class);

问题

如何修改以下行以适应第二个参数?

criteria.select(root).where(criteriaBuilder.equal(root.get("job"), paramJob));

我可以添加第二行吗:

criteria.select(root).where(criteriaBuilder.equal(root.get("person"), paramPerson));

谢谢

【问题讨论】:

    标签: java sql hibernate jpa jpa-2.0


    【解决方案1】:

    试试这个:

    criteria.select(root).where(
        criteriaBuilder.equal(root.get("job"), paramJob),
        criteriaBuilder.equal(root.get("person"), paramPerson)
    );
    

    【讨论】:

      【解决方案2】:

      在我看来是一种更有活力的方法。你将不得不调整一些东西,但这样你也可以设置一个动态的 where 子句:

      final EntityManagerFactory entityManagerFactory = entityManager.getEntityManagerFactory();
      final CriteriaBuilder criteriaBuilder = entityManagerFactory.getCriteriaBuilder();
      CriteriaQuery<Rating> criteria = criteriaBuilder.createQuery(Rating.class);
      Root<Rating> root = criteria.from(Rating.class);
      List<Predicate> predicates = new ArrayList<Predicate>();
      
      predicates.add(criteriaBuilder.equal(root.get("job"), Job.class)); //might need to change ther Person.class to whatever matches the job
      predicates.add(criteriaBuilder.equal(root.get("person"), paramPerson)); //same as above
      criteria.select(root).where(predicates.toArray(new Predicate[]{}));
      //execute query
      

      【讨论】:

        猜你喜欢
        • 2017-06-18
        • 2016-11-06
        • 2015-12-31
        • 2011-06-05
        • 2013-12-31
        • 1970-01-01
        • 1970-01-01
        • 2012-12-31
        • 2022-10-26
        相关资源
        最近更新 更多