【问题标题】:Hibernate Criteria builder IN clause queryHibernate Criteria builder IN子句查询
【发布时间】:2019-04-01 23:58:24
【问题描述】:

如何在 Hibernate 中为以下给定查询编写标准构建器 api 查询? batchId 不是主键,也不是唯一的。

SELECT * FROM User WHERE batchID IN ('1', '3')

我试过了:

    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<User> criteriaQuery = builder.createQuery(User.class);
    Root<User> userRoot = criteriaQuery.from(User.class);

    List<Integer> batchIdList = new ArrayList<>();
    batchIdList.add(1);
    batchIdList.add(3);

    Predicate queryPredicate = builder.in(userRoot.get(User_.batchId).in(batchIdList)); 

    criteriaQuery.select(userRoot);
    criteriaQuery.where(queryPredicate);

    TypedQuery<User> userQuery = entityManager.createQuery(criteriaQuery);

    List<User> userResult = userQuery.getResultList();

我什么也没得到,但数据存在于数据库中。

【问题讨论】:

  • “我什么也得不到”。是的,您执行了 SQL,您可以查看生成了什么 SQL,这会告诉您您的 Criteria 是否错误。你看过吗?
  • 启用休眠调试日志并查看它生成的查询。就这么简单。但是从您发布的代码来看,这看起来还不错。除非您的列名映射不正确。

标签: java hibernate jpa hibernate-criteria


【解决方案1】:

使用这个。我假设你的 batchId 是Integer

 CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        CriteriaQuery<User> criteriaQuery = builder.createQuery(User.class);
        Root<User> userRoot = criteriaQuery.from(User.class);
         criteriaQuery.select(userRoot);    

        List<Integer> batchIdList = new ArrayList<>();
        batchIdList.add(1);
        batchIdList.add(3);
        criteriaQuery            
  .where(builder.and(userRoot.get(User_.batchId).in(batchIdList)));
        TypedQuery<User> userQuery = entityManager.createQuery(criteriaQuery);

        List<User> userResult = userQuery.getResultList();

【讨论】:

  • @newguy 立即尝试更新答案。希望它可以正常工作,并确保您的数据库使用批次 id 1 和 3 记录。
【解决方案2】:

在 Hiberbate 5.3 及更高版本的条件查询中的 IN 子句的工作示例。

下面的例子找到员工的数据,名字在 (sumit,amit,vivek) 和 24 岁。

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;


public void getCriteria() {

        Session session = null;
        try {
            session = getSessionfactory().openSession();
            CriteriaBuilder builder = session.getCriteriaBuilder();
            CriteriaQuery<Employee> criteria = builder.createQuery(Employee.class);
            Root<Employee> root = criteria.from(Employee.class);
            List<Predicate> predicates = new ArrayList<Predicate>();
            predicates.add(builder.in(root.get("name")).value("sumit").value("amit").value("vivek"));   // IN clause
            predicates.add(builder.equal(root.get("age"),24));
            criteria.select(root).where(predicates.toArray(new Predicate[] {}));
            List<Employee> employeeList = session.createQuery(criteria).getResultList();
        }
        catch(Exception e) {
            System.out.println(e);
        }

    }

【讨论】:

    猜你喜欢
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2021-02-03
    • 2012-02-15
    • 2021-02-09
    相关资源
    最近更新 更多