gpt4 book ai didi

java - JPQL 获取最近的行

转载 作者:行者123 更新时间:2023-11-29 09:25:21 25 4
gpt4 key购买 nike

假设我有以下表格

my_profile_data
-------------
integer: my_profile_data_id
integer: profile_id
integer: profile_data_type_id
date: date_changed
string: value

my_profile
-------------
integer: profile_id
string: name

profile_data_type
-------------
integer: profile_data_type_id
string: name

我想获取每种配置文件数据类型的最新配置文件信息。在普通 SQL 中,这看起来像:

select mpd.profile_id, mpd.profile_data_type_id, mpd.value, max(mpd.date_changed) 
from my_profile_data mpd, my_profile mp
where mpd.profile_id = mp.profile_id and mp.name='The Profile I Want'
group by mpd.profile_data_type_id

我尝试了以下 JPQL 查询的不同变体,但无法使其正常工作。

SELECT mpd FROM MyProfileData mpd LEFT JOIN
(SELECT mpd.profileId profileId, MAX(mpd.dateChanged) FROM MyProfileData mpd
LEFT JOIN mp.profile
WHERE mp.name = :name
GROUP BY mpd.profileDataTypeId) recent
ON (rp.profileid = recent.profileId)

这个查询在 JPA 中可行吗?

我使用 EclipseLink 作为我的 JPA 供应商。

当我尝试运行它时得到的最里面的异常是

Caused by: NoViableAltException(81!=[506:7: (n= joinAssociationPathExpression ( AS )? i= IDENT | t= FETCH n= joinAssociationPathExpression )])
at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.join(JPQLParser.java:3669)
... 73 more

最佳答案

假设 DATE 实际上是一个您不担心冲突的时间戳,看起来您的查询可以像这样简单

select mpd 
from MyProfileData mpd
where mpd.profile.name = :name
and mpd.date = (select max(mpd1.date) from MyProfileData mpd1 where mpd1.profile.name = :name)

您是否正在使用像旧版 MySQL 那样讨厌子查询的 DBMS?

我也在想,也许你的问题是你没有将对象关系从 MyProfileData 映射到 ProfileData,你所拥有的只是字段的实际整数值。一般来说,这将使编写 JPQL 查询变得相当困难。

编辑:

继续假设日期不会与任何给定的配置文件 + 配置文件数据类型组合发生冲突,(因此日期唯一标识特定配置文件 + 配置文件类型组合的子集中的一行)您可以获取所有日期:

    select mpd from MyProfileData
where mpd.profile.name = :name
and mpd.date in (select max(mpd1.date)
from MyProfileData mpd1
where mpd1.profile = mpd.profile group by mpd.profileDataType)

您原来的 SQL 示例实际上是不合法的,因此很难想出一种方法来重现它看起来像它正在尝试做的事情,而没有一种方法可以在排除值的同时唯一地标识行。

关于java - JPQL 获取最近的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2759077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com