hibernate条件在连接3个表后获取具有最大列值的记录

时间:2015-03-19 10:02:47

标签: hibernate criteria

我正在编写一个带有spring mvc和hibernate的web应用程序,我使用hibernate标准来搜索给maxset值的结果集,但我有一个问题,我不知道如何将以下SQL语句转换为hibernate标准代码:

select * from
(select  md.display_id as mddisid, 
md.type as mdtype, 
ml.list_id, md.vo, 
md.status, 
md.dt_received, 
md.dt_ack,
md.dt_status, 
md.dt_appr,ml.dt_issue, 
ae.dt_enquiry, 
ae.dt_reply, 
ae.sys_app_id as sysappid, 
ae.type, 
ae.seq_no as sq
from md_app md
LEFT JOIN md_list ml
ON md.sys_app_id = ml.sys_app_id 
LEFT JOIN app_enq ae
ON ml.sys_app_id = ae.sys_app_id
where md.app_id = "AN000008") a
inner join (
select  md.display_id as mddisid, 
max(ae.seq_no) as maxsq
from md_app md
LEFT JOIN md_list ml
ON md.sys_app_id = ml.sys_app_id 
LEFT JOIN app_enq ae
ON ml.sys_app_id = ae.sys_app_id
where md.app_id = "AN000008" <-- an ID provided for searching
group by mddisid
) ss on a.mddisid = ss.mddisid and a.sq = ss.maxsq

我现在写的标准:

Criteria cr = session.createCriteria(MdApp.class, "mdapp");          
            cr.createAlias("mdapp.mdLists", "mdls", JoinType.LEFT_OUTER_JOIN); 
            cr.createAlias("mdapp.appEnqs", "ae", JoinType.LEFT_OUTER_JOIN); 
            cr.setProjection(Projections.distinct(Projections.projectionList()
                 .add(Projections.property("mdapp.displayId").as("displayId"))
                 .add(Projections.property("mdapp.type").as("type"))
                 .add(Projections.property("mdls.listId").as("listId"))
                 .add(Projections.property("mdapp.dbUser").as("dbUser"))
                 .add(Projections.property("mdapp.status").as("status"))
                 .add(Projections.property("mdapp.dtReceived").as("dtReceived"))
                 .add(Projections.property("mdapp.dtAck").as("dtAck"))
                 .add(Projections.property("mdapp.dtStatus").as("dtStatus"))
                 .add(Projections.property("mdapp.dtAppr").as("dtAppr"))
                 .add(Projections.property("mdls.dtIssue").as("dtIssue"))
                 .add(Projections.property("ae.dtEnquiry").as("dtEnq"))
                 .add(Projections.property("ae.dtReply").as("dtReply"))
                 .add(Projections.property("ae.id.sysAppId").as("sysAppId"))
                 .add(Projections.property("ae.id.type").as("AppEnqtype"))
                 .add(Projections.property("ae.id.seqNo").as("seq"))    

                 ));     

给出了这样的结果集,更少的列以便于说明:

  app_id   seq_number
   AN01       1
   AN01       2
   AN03       1
   AN03       2
   AN03       3
   AN04       1

但我想实现:

  app_id   seq_number       
   AN01       2       
   AN03       3
   AN04       1

我已经尝试了在线搜索的分离标准,但似乎选择了一条记录的情况。我还尝试使用 app_id groupProperty seq_number max ,只给出了seq_number = 1的记录。

因为我已经坚持了几天。 任何帮助将不胜感激,提前谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用createSQLQuery在hibernate中使用本机查询。