2012-10-08 85 views
0

我有一个MySql这样的查询:转换MySQL查询JPA命名查询

select AK.*, max(AA.activityDate) 
from AssessmentKey AK 
join AssessmentActivity AA on AA.ASSESSMENTKEY_ID = AK.id 
group by AK.id having max(AA.activityDate) <= '2012-10-02 17:30:55' 

有没有办法转换成JPANamedQuery。我正在使用OpenJPA

如果我把它直接进入:

@NamedQuery(name = "AssessmentActivity.findByDate", 
    query = "select AK.*, max(AA.activityDate) from AssessmentKey AK 
      join AssessmentActivity AA on AA.ASSESSMENTKEY_ID = AK.id 
      group by AK.id having max(AA.activityDate) <= '2012-10-02 17:30:55'") 

错误在这里显示:select AK.*identifier expected, got "*"而且它不喜欢on,在这里它说:

enter image description here

哪有我解决了这个问题?

回答

2

第一个问题:您应该用AK替换AK.*您只需要在此的实体别名。

第二个问题:连接语法不是这样的。你应该写:join并通过对象引用导航,如:AK.assesmentActivity并使用where关键字来代替on

这里有一个提示加入:JPQL join

记住:你是在ORM,处理实体及其属性,而不是数据库外键和列。

(PS:也许你想写一个NativeQuery在那里,你可以使用本机SQL语法)

编辑: (您的评论),所以你必须从AA开始查询:

select AK from AssesmentActivity AA join AssesmentKey AK where AA.assesmentKey = AK ... 

这样你可以加入他们。

+0

谢谢,我会尝试使用NativeQuery并让你知道它是否工作。 –

+0

它与NativeQuery一起工作,谢谢。 –

+0

NativeNamedQuery只适用于当前表,它不会加载与该表相关的其他对象。所以我试图做一个NamedQuery,但是加入语句存在问题。问题是,我不能这样做:AK.assesmentActivity,因为我的评估关键字没有任何映射到评估活动,只有评估活动有评估关键对象的多对一映射。任何想法如何使其工作而无需更改数据库,只是如何将此mysql查询转换为jpql? –