好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

关于使用jpa聚合函数遇到的问题

使用jpa聚合函数遇到的问题

spring data jpa 可以通过在接口中按照规定语法创建一个方法进行增删改查,可以快速开发。

但是一些特殊情况,如按条件查询统计,这个时候通过规定语法还是直接@Query写原生sql都不能解决,因为这个统计的条件不好添加。

百度之后,可以使用EntityManager来解决。

EntityManager 对象在一组实体类与底层数据源之间进行 O/R 映射的管理。它可以用来管理和更新 Entity Bean, 根椐主键查找 Entity Bean, 还可以通过JPQL语句增删改查实体。

首先通过@PersistenceContext注入EntityManager

?

1

2

@PersistenceContext

private EntityManager em;

使用如下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

BigDecimal totals = new BigDecimal( 0 );

StringBuffer sql= new StringBuffer( "SELECT SUM(total) FROM Order WHERE state = 1" );

if (StringUtils.isNotBlank(order.getOrderNo())) {

    sql.append( " AND orderNo = " ).append(order.getOrderNo());

}

if (StringUtils.isNotBlank(orderTime)) {

    sql.append( " AND orderPayTime LIKE '" ).append(orderTime).append( "%'" );

}

if (order.getCustomer() != null ) {

    //where条件后面是对象信息,不能直接传入对象拼成sql,会报错.

    sql.append( " AND customer = :customer" );

}

Query query = em.createQuery(sql.toString());

if (order.getCustomer() != null ) {

    //通过setParameter,给参数赋值.

    query.setParameter( "customer" , order.getCustomer());

}

Object result = query.getSingleResult();

if (result != null ) {

    totals = new BigDecimal(result.toString());

}

return totals;

jpa聚合函数(适用于联合查询)

最近帮老同事解决一个问题,场景是这样的,查询条件比较多,也就是我们说的联合查询,比如下面的,时间可以选不同的,状态和来源也可以选不同,而且可选可不选

如果这个时候写sql,是不是要各种条件判断,各种纠结,各种难写,各种sql,这个时候大家一般都想到了springdata的jpa貌似很好用,可以直接拼接sql,但是怎么拼接呢,又怎么支持非表字段的展示呢,比如表中一个字段 aaa 好展示,但是查总和sum(aaa) ,怎么把这个作为一个字段展示呢。

不罗嗦了,直接上代码

以下语句对应的sql大概是

?

1

select count (***) from *** where *** group by ***

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

private List<Tuple> getCountByStatusOrSource(Integer status, Integer source, Integer userId, String startTime, String endTime, Integer timeSlot, String type) throws Exception {

         CriteriaBuilder cb = entityManager.getCriteriaBuilder();

         Date sTime = new Date(), eTime = new Date();

         CriteriaQuery<Tuple> query = cb.createTupleQuery();

         Root<AAA> root = query.from(AAA. class ); //AAA是对应数据库的类名,替换成自己的

         Path<Integer> statusPath = root.get( "status" );

         Path<String> statusNamePath = root.get( "status" ).get( "name" );

         Path<Integer> sourcePath = root.get( "source" );

         Path<Date> operatorPath = root.get( "operator" );

 

         List<Predicate> predicateList = new ArrayList<>();

         if (source != null ) {

             predicateList.add(

                 cb.equal(sourcePath, source)

             );

         }

         if (userId != null ) {

             predicateList.add(

                 cb.equal(operatorPath, userId)

             );

         }

         Map timeMap = getChangedTime(startTime, endTime, timeSlot); //获取时间的方法,具体代码我就不沾了,自己写个就行了

         sTime = (Date) timeMap.get( "sTime" );

         eTime = (Date) timeMap.get( "eTime" );

       

             Expression<Date> startDateExpression = cb.literal(sTime);

             Expression<Date> endDateExpression = cb.literal(eTime);

             predicateList.add(

                 cb.between(updateTimePath, startDateExpression, endDateExpression)

             );     

 

         Predicate[] predicates = new Predicate[predicateList.size()];

         predicates = predicateList.toArray(predicates);

         query.where(predicates); //where条件加上

         if ( "status" .equals(type)) {

             query.select(cb.tuple(statusPath, cb.count(root)));

             query.groupBy(statusPath);

         }

        

         //query.multiselect(statusPath, cb.count(root));//

         TypedQuery<Tuple> q = entityManager.createQuery(query);

         List<Tuple> result = q.getResultList();

         return result;

     }

这个sql,我们分别查到了两个值 status 和数量,那么怎么获取呢

循环一下那个获取的list

?

1

2

3

Tuple tuple = list.get(i);

( long )tuple.get( 0 )获取的是数量

(Integer)tuple.get( 1 )获取的是状态id

到这是否全部清晰了呢,这个例子也适用sum,max等其他聚合函数

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/sinat_33151213/article/details/81066366

查看更多关于关于使用jpa聚合函数遇到的问题的详细内容...

  阅读:18次