【问题标题】:Convert MySql query to JPA named query将 MySql 查询转换为 JPA 命名查询
【发布时间】:2012-09-28 11:33:09
【问题描述】:

我有一个像这样的MySql 查询:

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,这里它说:

我该如何解决这个问题?

【问题讨论】:

    标签: java mysql sql jpa openjpa


    【解决方案1】:

    第一个问题:你应该用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 ...
    

    这样你就可以加入他们了。

    【讨论】:

    • 谢谢,我会尝试使用 NativeQuery 并让您知道它是否有效。
    • NativeNamedQuery 仅适用于当前表,它不会加载与该表相关的其他对象。所以我正在尝试创建一个 NamedQuery,但是 join 语句存在问题。问题是我不能这样做:AK.assesmentActivity 因为我的评估密钥没有任何映射到评估活动,只有评估活动在评估密钥对象上具有多对一映射。任何想法如何在不更改数据库的情况下使其工作,只是如何将此 mysql 查询转换为 jpql?
    猜你喜欢
    • 2018-03-13
    • 2016-07-18
    • 2023-04-01
    • 2020-10-03
    • 1970-01-01
    • 2020-10-21
    • 2019-01-11
    • 2019-07-29
    • 2018-11-01
    相关资源
    最近更新 更多