Преобразование запроса Oracle SQL в запрос JPQL

У меня возникла проблема при создании запроса JPQL, полученного из собственного запроса Oracle SQL. Некоторые люди советовали мне использовать нативный запрос, но я хочу использовать способность постоянства. Вот родной оператор 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...


person faisal_w    schedule 20.01.2011    source источник
comment
возможный дубликат Есть ли такое выражение CASE в JPQL?   -  person skaffman    schedule 20.01.2011


Ответы (2)


Какая у вас объектная модель?

Вы можете просто определить класс Company для сопоставления с таблицей компании. Вместо того, чтобы делать это в случае с SQL, просто сопоставьте столбец оценок либо с помощью @Convert в EclipseLink, либо просто сопоставьте его напрямую и используйте методы в вашей объектной модели с именем getRisk(), которые возвращают Enum на основе значения. (т.е. но логика в вашей объектной модели, а не в SQL).

Вы можете использовать нативный SQL-запрос в JPA, если хотите, или даже использовать функцию CASE в JPQL, но размещение логики в вашей объектной модели будет лучшим решением.

person James    schedule 20.01.2011
comment
Я попытался создать сущность Company and Registers с помощью Netbeans (auto), но это решение не пришло мне в голову. Так что лучше всего, если я использую значение Enum в объекте, не так ли? Хорошо, я попробую...‹br/›большое спасибо, Джеймс! - person faisal_w; 21.01.2011

В 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()

person pablo pidal    schedule 14.02.2013