我只是好奇o
当我尝试查询时代表什么。
默认情况下,我的查询是
@NamedQuery (name="newName" query=SELECT o FROM tableView o)
我只是好奇o
代表什么。我见过几个使用这封信的x
例子c
。只是想知道有什么区别,如果有的话。另外,为什么我不能只使用 a*
来选择整行?
在 JQPL 术语中称为标识变量。在 SELECT 语句中使用时,标识变量在 FROM 子句中声明。如果某些(实体的)持久属性、实体本身或从持久属性推导出的某些值是作为查询的结果设计的,则必须在 SELECT 语句中使用它。
SELECT a.someAttribute FROM EntityA a
SELECT a FROM EntityA a
SELECT SUM(a.someAttribute) FROM EntityA a
不使用a.
的相同查询不是有效的 JQPL 查询。它们确实在 Hibernate 中工作,因为 HQL 作为一种查询语言确实有很多扩展。
当查询包含多个具有相同属性名称的实体时,识别变量的需求就很明显了:
SELECT a.someAttribute, b.someAttribute
FROM EntityA a, EntityB
WHERE a.id = b.id
从上面的查询中可以看出,标识变量也用于 WHERE 子句。以下来自 JPA 2.0 规范的引用也非常严格地总结了它们的其他用途和声明:
SELECT 或 DELETE 语句的 SELECT、WHERE、ORDER BY、GROUP BY 或 HAVING 子句中使用的所有标识变量都必须在 FROM 子句中声明。UPDATE 语句的 WHERE 子句中使用的标识变量必须在 UPDATE 子句中声明。
识别变量在这些条款中被量化。这意味着标识变量表示集合的成员或实体抽象模式类型的实例。标识变量从不完整地指定一个集合。
标识变量的范围仅限于定义它的查询(或子查询),并且对于该查询范围内未定义同名标识变量的任何子查询也是可见的。
标识变量的命名是完全自由的,但它不应该是任何保留的标识符或实体的名称。
您不能使用“SELECT *”,因为 JPQL 没有这样的结构。在 SQL 中,不明确指定要选择的值列表也经常被认为是一种反模式。例如,当将连接添加到查询时,需要重新定义选择的内容。
它只是一个别名——你可以使用任何你喜欢的东西。在您的示例中这并不是必需的,但是对于连接多个表的更复杂的示例,它可以让您引用特定表的属性。例如:
SELECT A from tableA A, tableB B where B.someId=A.id;