SELECT e来自员工e - 为什么多余的“e”?

时间:2012-08-03 07:47:50

标签: java jpa syntax jpql

Sample查询:

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

在这种语法中,似乎直观地说SELECT e,现在声明或定义了e(?)。但是,第二个eFROM Employee e不是多余的吗?

这是与SQL SELECT syntax的回归或相似之处?

6 个答案:

答案 0 :(得分:4)

第二个eidentification 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非常相似,区别在于:

  • 此查询不会从列返回一组记录,而是返回一组记录 返回一个实体。
  • 此实体别名为e,称为 识别变量。
  • 此识别变量与之相关 员工类型,这意味着结果将是员工的实体 类型。

答案 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部分正在做的事情。