Спецификация Spring с подзапросом, выражением union, join и case - PullRequest
0 голосов
/ 09 июля 2019

У меня очень длинные и сложные запросы, я использую данные Spring,

Может кто-нибудь, пожалуйста, помогите мне выполнить нижеприведенный запрос в Spring Jpa, я не могу использовать собственный запрос, так как Spring не поддерживает внедрение параметровв подзапросах.

select desc as desc, priority as priority, activeUser as activeUser, 
totalUser as totalUser
 from  
(
  select stat.desc as desc, 
  stat.priority as priority,
  (case when sum(activeUser) is null then 0 else sum(activeUser) end) as 
  activeUser, 
   (case when sum(totalUser) is null then 0 else sum(totalUser) end) as 
  totalUser
  from lookup.user stat left outer join 
  (
  select user.role as role,  
  sum (case when user.STATUS = 'ACTIVE' then 1 else 0 end) as activeUser,
  count(*) as totalUser,
  user.group as group
  from ctrl.user user  
  where user.group =:userGroup 
  and user.branch_code =:branchCode
  group by user.role,user.group
  ) as tbl on stat.role = tbl.role and stat.group = tbl.group
  where stat.group =:userGroup
  group by stat.desc, stat.priority
 union
 select 'Total' as desc, 
 '999' as priority,
   (case when sum(activeUser) is null then 0 else sum(activeUser) end) as 
    activeUser, 
   (case wh en sum(totalUser) is null then 0 else sum(totalUser) end) as 
   totalUser
  from lookup.user stat left outer join 
   (
  select user.role as role,  
  sum (case when user.STATUS = 'ACTIVE' then 1 else 0 end) as activeUser,
    count(*) as totalUser,
   user.group as group
   from ctrl.user user 
   where user.group =:userGroup
   and user.branch_code =:branchCode
   group by user.role,user.group
   ) as tbl on stat.role = tbl.role and stat.group = tbl.group
   where stat.group =:userGroup
    ) as tblMain order by priority 

Я пытался сгенерировать predicate, как показано ниже, но это не занимает selects

  Specification<CtrlUser> sp= new Specification<CtrlUser>() {

        @Override
        public Predicate toPredicate(Root<CtrlUser> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            // TODO Auto-generated method stub


            query.multiselect(root.get("role"), cb.selectCase().when(root.get("status").in("ACTIVE"), 1).otherwise(0).alias("ActiveUsers"),
                    cb.count(root).alias("totalUsers"),root.get("group")).groupBy(root.get("role"),root.get("group"));
            return cb.and(cb.equal(root.get("branchCode"), branchCode), cb.equal(root.get("group"), userGroup));
        }
    };

Я искал в Интернете, но не так много удачи.

если требуется дополнительная информация, пожалуйста, дайте мне знать.

...