2017-03-16 96 views
0

我有一个ISO 4217 values货币(有6行,ID,国家,Currency_Name,Alphabetic_code,Numeric_Code,Minor_Unit)表。选择DISTINCT JPA

我需要得到一些数据为4 most used currencies,和我的“纯粹”的SQL查询是这样的:

select distinct currency_name, alphabetic_code, numeric_code 
from currency 
where ALPHABETIC_CODE IN ('USD','EUR','JPY','GBP') 
order by currency_name; 

与我所需要的数据返回一个4行的表。到现在为止还挺好。

现在我必须将其转换为我们的JPA xml文件,并且问题开始了。我试图让该查询是这样的:

SELECT DISTINCT c.currencyName, c.alphabeticCode, c.numericCode 
FROM Currency c 
WHERE c.alphabeticCode IN ('EUR','GBP','USD','JPY') 
ORDER BY c.currencyName 

这将返回一个列表有一行有一些这些货币的每个国家(好像没有上查询“DISTINCT”)。我为什么挠头。所以问题是:

1)我该如何使这个查询返回“纯”SQL给我的东西?

2)为什么这个查询似乎忽略了我的“DISTINCT”子句?我在这里错过了一些东西,但我没有得到什么。发生了什么,我没有得到什么?

编辑:好吧,这是越来越怪异。不知何故,该JPA查询按预期工作(返回4行)。我试过这个(因为我需要一些更多的信息):

SELECT DISTINCT c.currencyName, c.alphabeticCode, c.numericCode, c.minorUnit, c.id 
FROM Currency c 
WHERE c.alphabeticCode IN ('EUR','GBP','USD','JPY') 
ORDER BY c.currencyName 

而且似乎ID是搞乱一切,从查询移除它可以追溯到返回4行的表。放括号是没用的。

btw,我们正在使用eclipse链接。

+0

日志为您JPQ提供商会告诉你它已将JPQL翻译成的SQL。 –

回答

1

你的问题是,当你试图检索的列清单(c.currencyName, c.alphabeticCode, c.numericCode, c.minorUnit, c.id)

  • 不同的是在SELECT子句

中提到的所有列运行,我相信“ID “列是您的分表中的每条记录都是唯一的,因此您有可能在您的其他列中获取重复项(c.currencyName, c.alphabeticCode, c.numericCode, c.minorUnit)

因此,在您的情况下,DISTINCT在整行上运行,而不是 特定列。如果您想获取唯一名称,请只选择 列。

的情况下,要对多列,你可以做这样的事情上运行的不同,使用GROUP BY例如以意图找到使用c.currencyName, c.alphabeticCode

SELECT DISTINCT c.currencyName, c.alphabeticCode, c.numericCode,c.id 
FROM Currency c 
WHERE c.alphabeticCode IN ('EUR','GBP','USD','JPY') GROUP BY c.currencyName, c.alphabeticCode 
ORDER BY c.currencyName 
+0

好吧,现在我明白了,在运行一些更多的测试之后,我会在某些查询中责怪一个拼写错误,因为DISTINCT在SQL和JPA上表现不同。顺便说一句,GROUP BY子句不起作用......我想我现在将ID留在外面。 – Neuromante