Sample查询:
SELECT e FROM Employee e WHERE SUBSTRING(e.name, 3) = 'Mac'
在这种语法中,似乎直观地说SELECT e
,现在声明或定义了e
(?)。但是,第二个e
:FROM Employee e
不是多余的吗?
这是与SQL SELECT syntax的回归或相似之处?
答案 0 :(得分:4)
第二个e
是identification variable。它实际上通过告诉JPQL解析器您在查询中的其他位置使用e
并且它引用e
实体来定义Employee
。第一次出现e
是您e
。
所以,这并不多余。如果省略第一个,JPQL解析器不知道要选择什么。如果你第二次将它遗漏,那么你选择的是JPQL解析器不知道的东西。
答案 1 :(得分:3)
JPQL语法与普通SQL语法略有不同。根据您的示例,首先e代表普通SQL的*。所以这不是多余的。但是你使用JPA 2.x,使用条件查询比JPQL更好
答案 2 :(得分:1)
我和你一样关注这个问题。我注意到,当您选择* 时,结果会出现在列中,当您选择e 时,只有一列具有某种序列化实体作为结果。所以我在http://www.thejavageek.com/2014/03/17/jpa-select-clause/
找到了一个非常好的解释SELECT e FROM Employee e
这与SQL非常相似,区别在于:
答案 3 :(得分:0)
使用“e。” (你有哪些栏目)
SELECT e.name, e.e FROM Employee e WHERE SUBSTRING(e.name, 3) = 'Mac'
答案 4 :(得分:0)
IMO没有必要在这种情况下使用第二个e(是的,这是多余的),如果您有这样的单个查询。当您连接两个表时这是有意义的,如果这两个表有共同的列名,那么您将使用该表别名'e'选择每个列
答案 5 :(得分:0)
免责声明:这仅适用于Hibernate作为JPA实现,因为此信息对应于HQL。
在这个简单的例子中,您不必使用e
(这只不过是一个别名)。由于您选择的是完整的实体,因此您甚至不必编写select e
部分。所以你可以写:
FROM Employee WHERE SUBSTRING(name, 3) = 'Mac'
说明:
from
部分中,您可以指定要查找的实体。 e
后面的Employee
只是Employee
的别名,您可以用它来处理整个对象(select
部分)或来自它的属性。在简单查询中,您不需要它,但是一旦您在查询中加入了联接,使用别名总是一个好主意。select
部分用于选择要返回的实体的哪些属性。如果在这种情况下省略'select part or just specify the alias (
e`,则JPA会返回整个实体。在SQL中,这通常不起作用(至少对于Oracle而言)。要在评论中回答您的问题:您可以在查询的e
部分中使用别名select
。但是为了这样做,你必须教JPA e
所指的内容。这就是from Employee e
部分正在做的事情。