簡體   English   中英

如何在 hibernate.ejb 中編寫內連接選定表查詢

[英]how to write inner join a selected table query in hibernate.ejb

我有一個查詢工作正常:

StringBuilder query = new StringBuilder(
        "select o.deviceName, o.deviceOs, o.loginOn, e.username, e.name, e.idNo from LoginHistory o, User e ");
    query.append(" where o.userId = e.userId");
Query q = getEm().createQuery(query.toString());

createQuery()將 go 到 class org.hibernate.ejb.AbstractEntityManagerImpl中的 createQuery() 。

我想編輯查詢以獲取每個用戶的最后一次登錄。 以下 SQL 查詢可以在 db2 命令中成功運行:

select m1.*, m2.*
from tibs.LoginHistory m1 inner join (
    select userId, max(loginOn) as loginOn from tibs.LoginHistory group by userId
    ) m2
on m1.userId = m2.userId and m1.loginOn = m2.loginOn;

但是當我嘗試在上面的代碼中應用它時,它會遇到QuerySyntaxException: unexpected token: at ( after inner join

代碼類似於:

StringBuilder query = new StringBuilder(
        "select o.deviceName, o.deviceOs, o.loginOn, e.username, e.name, e.cif, e.idNo from LoginHistory o, ECUser e ");
    query.append("inner join (select o2.userId, o2.max(loginOn) as loginOn from LoginHistory group by userId) o2 ");
    query.append("on o.userId = o2.userId and o.loginOn = o2.loginOn");
    query.append(" where o.userId = e.userId");

以這種方式可行嗎? 如果是,我應該使用什么語法?

還是 Hibernate 不接受這個,我需要用另一種方式來做?

添加**即使我將查詢更改為此,仍然相同:

StringBuilder query = new StringBuilder(
        "select o.deviceName, o.deviceOs, o.loginOn, e.username, e.name, e.cif, e.idNo from LoginHistory o, ECUser e ");
    query.append("inner join (select o2.userId, o2.max(loginOn) as loginOn from LoginHistory o2 group by userId) ");
    query.append("on o.userId = o2.userId and o.loginOn = o2.loginOn");
    query.append(" where o.userId = e.userId");

我認為內部查詢應該如下(注意o2的 position ):

(select o2.userId, o2.max(loginOn) as loginOn from LoginHistory o2 group by userId)

請適當命名變量以方便理解。
如果將o2重命名為lh會很有幫助,因為它代表LoginHistory實體。

(select lh.userId, lh.max(loginOn) as loginOn from LoginHistory lh group by userId)

您可以使用以下查詢:

select o.deviceName, o.deviceOs, o.loginOn, e.username, e.name, e.idNo
from LoginHistory o, User e 
where o.id = (select max(lh.id) from LoginHistory lh where lh.userId = e.userId)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM