简体   繁体   English

是否可以在 JPA 中使用 window 函数?

[英]Is it possible to use window functions in JPA?

I need to use window functions within a Spring Data Repository, is this possible?我需要在 Spring 数据存储库中使用 window 函数,这可能吗?

I am now using java spring maven and I have no knowledge about the entity table partition in JPA.我现在正在使用 java spring maven 并且我不知道 Z9CE3C446BD883909508A 中的实体表分区。

My SQL Query我的SQL查询

select 
b.q_stop_id as q_stop_id,
b.q_work_day as q_work_day,
b.q_work_end as q_work_end,
b.q_mc_num as q_mc_num,
b.q_mc_name as q_mc_name,
b.Hnbn as q_hnbn,
b.q_koku as q_koku,
b.q_stop_st_time as q_stop_st_time,
b.q_stop_en_time as q_stop_en_time,
b.q_stop_time_s as q_stop_time_s,
b.q_stop_maj_code as q_stop_maj_code,
b.q_stop_major as q_stop_major,
b.q_stop_num as q_stop_num,
b.q_stop_minor as q_stop_minor,
b.q_pause_flag as q_pause_flag              
from        
(
select ROW_NUMBER() OVER (PARTITION BY a.rnk
ORDER BY a.q_stop_st_time,a.q_stop_en_time) AS RowNo,COUNT(*) OVER () as cnt,*          
from (
select DENSE_RANK() OVER(PARTITION BY proL.q_set_hnbn ORDER BY stL.q_stop_st_time,stL.q_stop_en_time DESC) as rnk,case when proL.q_set_hnbn  is not null and proL.q_set_hnbn !='' then proL.q_set_hnbn  else proL.q_hnbn end as Hnbn ,proL.q_set_hnbn as setHnbn, stL.q_stop_id as q_stop_id,wk.q_work_day as q_work_day,wk.q_work_end as q_work_end,mc.q_mc_num as q_mc_num,mc.q_mc_name as q_mc_name,proL.q_hnbn as q_hnbn,proL.q_koku as q_koku,stL.q_stop_st_time as q_stop_st_time,stL.q_stop_en_time as q_stop_en_time,stL.q_stop_time_s as q_stop_time_s,mst.q_stop_maj_code as q_stop_maj_code,mst.q_stop_major as q_stop_major,mst.q_stop_num as q_stop_num,mst.q_stop_minor as q_stop_minor,
mst.q_pause_flag as q_pause_flag  
from T_STOP_LOG stL inner join  M_stop_item mst on stL.q_stop_num=mst.q_stop_num 
inner join T_work_log wk on stL.q_work_id=wk.q_work_id 
inner join T_prod_log proL on wk.q_work_id =proL.q_work_id 
inner join M_mc mc on wk.q_mc_num=mc.q_mc_num 
left join T_malfunction_repair_log r on r.q_stop_id=stL.q_stop_id 
where wk.q_work_day >='2021-04-19 00:00:00.000' and 
wk.q_work_end<='2021-04-20 23:59:59.000' and mc.q_mc_num='1200' )a 
)b where b.RowNo=1 or  b.RowNo=2
    

> I found the solution by using JPA nativeQuery = true > 我通过使用 JPA nativeQuery = true 找到了解决方案

@Query(value = "select " + "b.q_stop_id as q_stop_id," + "b.q_work_day as q_work_day,"
        + "b.q_work_end as q_work_end," + "b.q_mc_num as q_mc_num," + "b.q_mc_name as q_mc_name,"
        + "b.Hnbn as q_hnbn," + "b.q_koku as q_koku," + "b.q_stop_st_time as q_stop_st_time,"
        + "b.q_stop_en_time as q_stop_en_time," + "b.q_stop_time_s as q_stop_time_s,"
        + "b.q_stop_maj_code as q_stop_maj_code," + "b.q_stop_major as q_stop_major,"
        + "b.q_stop_num as q_stop_num," + "b.q_stop_minor as q_stop_minor," + "b.q_pause_flag as q_pause_flag "
        + "from" + "(" + "select ROW_NUMBER() OVER (PARTITION BY a.rnk "
        + "ORDER BY a.q_stop_st_time,a.q_stop_en_time) AS RowNo,COUNT(*) OVER () as cnt,*   "
        + "from (select  DENSE_RANK() OVER(PARTITION BY proL.q_set_hnbn ORDER BY stL.q_stop_st_time,stL.q_stop_en_time DESC) as rnk,case when proL.q_set_hnbn  is not null and proL.q_set_hnbn !='' then proL.q_set_hnbn  else proL.q_hnbn end as Hnbn ,proL.q_set_hnbn as setHnbn,stL.q_stop_id as q_stop_id,wk.q_work_day as q_work_day,wk.q_work_end as q_work_end,mc.q_mc_num as q_mc_num,mc.q_mc_name as q_mc_name,proL.q_hnbn as q_hnbn,proL.q_koku as q_koku,stL.q_stop_st_time as q_stop_st_time,stL.q_stop_en_time as q_stop_en_time,stL.q_stop_time_s as q_stop_time_s,mst.q_stop_maj_code as q_stop_maj_code,mst.q_stop_major as q_stop_major,mst.q_stop_num as q_stop_num,mst.q_stop_minor as q_stop_minor,"
        + "mst.q_pause_flag as q_pause_flag  "
        + "from T_STOP_LOG stL inner join  M_stop_item mst on stL.q_stop_num=mst.q_stop_num "
        + "inner join T_work_log wk on stL.q_work_id=wk.q_work_id "
        + "inner join T_prod_log proL on wk.q_work_id =proL.q_work_id "
        + "inner join M_mc mc on wk.q_mc_num=mc.q_mc_num "
        + "left join T_malfunction_repair_log r on r.q_stop_id=stL.q_stop_id "
        + "where wk.q_work_day >=:workDay and wk.q_work_end<=:workEnd and mc.q_mc_num=:kiban)a "
        + ")b where b.RowNo=1 or  b.RowNo=2", nativeQuery = true)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM