1

示例查询:

SELECT e FROM Employee e WHERE SUBSTRING(e.name, 3) = 'Mac'

在这种语法中,很直观地说SELECT ee现在已声明或定义(?)。e但是,第二个:不是FROM Employee e多余的吗?

这是与SQL SELECT 语法的倒退或相似之处?

4

6 回答 6

4

第二个e识别变量。它实际上是e通过告诉 JPQL 解析器您e在查询中的其他地方使用它来定义的,并且它引用了Employee实体。第一个出现的e地方是你使用那个e

所以,这不是多余的。如果您忽略第一个,JPQL 解析器不知道要选择什么。如果您第二次忽略它,您将选择 JPQL 解析器不知道的东西。

于 2012-08-03T08:01:11.360 回答
3

JPQL 语法与普通 SQL 语法略有不同。根据您的示例,第一个 e 代表普通 SQL 的 *。所以它不是多余的。但是你使用 JPA 2.x,使用条件查询比 JPQL 更好

于 2012-08-03T08:05:09.570 回答
1

我带着和你一样的担忧来回答这个问题。我注意到,当您选择 *时,结果以列的形式出现,而当您选择 e时,只有一列带有某种序列化实体作为结果。所以我在http://www.thejavageek.com/2014/03/17/jpa-select-clause/找到了一个很好的解释


SELECT e FROM Employee e

这与 SQL 非常相似,不同之处在于:

  • 此查询不会从列中返回一组记录,而是返回一个实体。
  • 该实体别名为 e ,称为标识变量。
  • 此标识变量与 Employee 类型相关联,这意味着结果将是 Employee 类型的实体。
于 2017-04-20T15:09:53.083 回答
0

如果您有这样的单个查询,IMO 在这种情况下不需要使用第二个 e (是的,它是多余的)。当您连接两个表时这是有意义的,如果这两个表具有共同的列名,那么您将使用该表别名“e”选择每一列

于 2012-08-03T07:55:41.737 回答
0

免责声明:这仅适用于 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 这指的是什么。这就是该部分正在做的事情。eselectefrom Employee e

于 2012-08-03T08:12:08.307 回答
0

你看。” (你有哪些列)

  SELECT e.name, e.e FROM Employee e WHERE SUBSTRING(e.name, 3) = 'Mac'
于 2012-08-03T07:50:26.870 回答