当前位置: 首页 > 知识库问答 >
问题:

在子句查询中Hibernate条件生成器

童化
2023-03-14

如何在Hibernate中为下面给定的查询编写criteria builder api查询?batchId不是主键

从用户中选择批号('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();

除了数据库中存在的数据外,我什么也得不到。

共有2个答案

曹华荣
2023-03-14

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);
        }

    }
姜智渊
2023-03-14

用这个。我假设您的batchId是整数

 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();
 类似资料:
  • 我试图使用CritierBuilder/CrtieriaQuery执行select语句,从表a中选择某些字段,然后如果该记录存在于另一个表中,则使用布尔标志。 基本上,我有一个“官员”列表和一个用户列表。用户是使用该系统的人,可以为官员添加书签/保存信息。当用户询问官员时,我希望能够显示他们已经为哪些官员添加了书签。 所以这个查询,我在我的h2数据库控制台中运行,它(相当)有效。如果官员被用户12

  • 我正在尝试使用criteriaBuilder和谓词构建一个SQL where子句,以创建一些SQL语句,如: AND或对列表周围的括号对于将它们与不存在分开很重要。这是因为和有优先权我得到的是 我可以构建所有谓词,没有问题,但我不知道如何让它在AND或PAIRES列表中添加括号 AND或OR对的列表是这样构建成1个谓词列表的 子查询是这样添加的 还有地点 每个AND或AND对周围的括号也一样好

  • 问题内容: 如何使用Criteria编写以下SQL: 问题答案: 要使用NHibernate,产生如下查询: 我们必须选择: 将子选择映射为实体。 创建原始SQL查询 第一种选择是创建一些,并将其映射为一个实体。如果我们不喜欢视图(或无法创建视图),则可以使用NHibernate映射元素element的功能 : 第二种选择是关于使用NHibernate API创建本机/原始SQL: 它没有从映射中

  • 问题内容: SELECT supplier_id FROM suppliers UNION ALL 我只是在查询的“ UNION ALL”子句上方和查询的“ UNION ALL”子句上方创建两个条件。 但是我的问题是我如何在条件中执行UNION ALL子句?提前致谢。 问题答案: 我认为hibernate不支持条件,但是您可以使用两个条件查询来获得预期的结果:

  • 问题内容: 有没有一种方法可以使SQLAlchemy使用自定义列生成查询,该自定义列是与当前行相关的子查询: 使用ORM API? 我正在使用PostgreSQL 9.3和旧版本的SQLAlchemy 0.9.8 问题答案: 如果您经常需要这样做,并且/或者计数是模型不可或缺的一部分,则应该使用混合属性,如其他答案中所述。另一方面,如果只需要一个查询就可以使用,则可以使用或创建标量子查询: 子查询