Spring JPA使用CriteriaBuilder动态构造查询

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/mzdljgz/p/11495723.html

在使用Spring JPA提供的方法只能进行简单的CRUD,如果遇到复杂的情况就需要我们动态来构建查询条件了。这里我们来看使用CriteriaBuilder如何来构造查询。
核心代码:

  @PersistenceContext
  private EntityManager entityManager;



/**
     * 查询所有菜单
     *
     * @return
     */
    public List<MenuInfo> findAllMenu() {
        CriteriaBuilder builder = entityManager.unwrap(SessionImpl.class).getCriteriaBuilder();
        CriteriaQuery<MenuInfo> criteriaQuery = builder.createQuery(MenuInfo.class);
        Root<MenuInfo> root = criteriaQuery.from(MenuInfo.class);
        criteriaQuery.select(root);
        criteriaQuery.where(builder.equal(root.get("systemFlag"), Constant.SystemFlag.MANAGE_B));
        return entityManager.unwrap(SessionImpl.class).createQuery(criteriaQuery).getResultList();
    }
  • 调用entityManager.unwrap(SessionImpl.class).getCriteriaBuilder();来获取CriteriaBuilder。CriteriaBuilder可以用于创建CriteriaQuery、CriteriaUpdate和CriteriaDelete。除此之外类似count、max等函数也是由CriteriaBuilder来创建的。其中Entitymanager可以使用@PersistenceContext注解来进行注入。
  • 调用criteriaBuilder.createQuery来创建CriteriaQuery。其中createQuery的参数是Query返回值类型。
  • 调用criteriaQuery.from(MenuInfo.class)。参数是对应于MenuInfo表的实体类,query.from类似于sql中的from语句,该方法的执行等价于sql中的from MenuInfo。
  • 调用 criteriaQuery.select创建映射。 criteriaQuery.select(criteriaBuilder.count(root.get(“id”)))等价于select count(id)。如果执行criteriaQuery.select(root)则等价于select *。
  • 使用CriteriaBuilder构造查询条件Predicate,该predicate也就是在where后面的条件子句。
  • 执行查询获取数据。
原文地址:https://www.cnblogs.com/mzdljgz/p/11495723.html