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