【问题标题】:Converting an Oracle SQL Query to JPQL Query将 Oracle SQL 查询转换为 JPQL 查询
【发布时间】:2011-06-12 04:31:05
【问题描述】:

我在创建派生自本机 Oracle SQL 查询的 JPQL 查询时遇到问题。有些人告诉我使用本机查询,但我想利用持久性的能力。这是原生的 Oracle SQL 语句:

SELECT a.taxnumber, b.compid, b.compnum, 
(case 
    when b.score > 80 then 'LOW RISK' 
    when b.score between 65 and 80 then 'MEDIUM RISK'
    when b.score > 65 then 'HIGH RISK' 
    else null end) status 
FROM registers a, company b

有谁知道如何将其转换为 JPQL 查询?我感到困惑的是case when 声明...

【问题讨论】:

标签: jpa eclipselink jpql


【解决方案1】:

你的对象模型是什么?

您可以只定义一个映射到公司表的公司类。如果不使用 SQL,只需使用 EclipseLink 中的 @Convert 映射分数列,或者直接映射它并在对象模型中使用名为 getRisk() 的方法,该方法返回基于值的 Enum。 (即对象模型中的逻辑,而不是 SQL 中的逻辑)。

如果你真的想的话,你可以在 JPA 中使用原生 SQL 查询,甚至可以在 JPQL 中使用 CASE 函数,但是将逻辑放在你的对象模型中是最好的设计。

【讨论】:

  • 我尝试使用 Netbeans(auto) 生成公司和注册实体,但我并没有想到该解决方案。所以最好如果我在实体中使用 Enum 值,不是吗?好的,我会尝试一下...
    非常感谢,James!
【解决方案2】:

在 JPA 2.0 中,您可以使用“CASE WHEN”

http://en.wikibooks.org/wiki/Java_Persistence/JPQL_BNF#New_in_JPA_2.0

否则,您可以在实体中定义这样的方法:

public String getRiskByScore(){
   String risk = null;
   if(this.score > 80) risk = "LOW RISK";
   else if ....
   return risk;
}

JPQL 查询:

SELECT a.taxnumber, b.compid, b.compnum, b.score 
FROM registers a, company b

然后,你会打电话给getRiskByScore()

【讨论】:

    猜你喜欢
    • 2021-10-09
    • 2013-09-17
    • 2011-09-29
    • 2017-10-29
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    相关资源
    最近更新 更多