我很好奇当我试图查询时o
代表什么。
默认情况下,我的查询出现为
@NamedQuery (name="newName" query=SELECT o FROM tableView o)
我很好奇o
代表的是什么。我已经看到了使用字母x
和c
的几个实例。只是想知道有什么区别,如果有的话。另外,为什么我只能使用*
来选择整行?
答案 0 :(得分:1)
在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,WHERE,ORDER BY中使用的所有标识变量, 必须是SELECT BY或DELETE语句的GROUP BY或HAVING子句 在FROM子句中声明。中使用的识别变量 必须在UPDATE中声明UPDATE语句的WHERE子句 子句。
识别变量在这些中存在量化 条款。这意味着标识变量代表a 集合的成员或实体的抽象模式的实例 类型。标识变量从不在其中指定集合 整体。
标识变量的范围限定为查询(或子查询) 它被定义,并且对于其中的任何子查询也是可见的 查询范围,未定义相同的标识变量 名。
识别变量的命名是完全免费的,但它不应该是任何保留的标识符或实体的名称。
你不能使用'SELECT *',因为JPQL没有这样的结构。它通常也被认为是SQL中的反模式,不能明确指定要选择的值列表。例如,当将连接添加到查询时,它将需要重新定义所选的内容。
答案 1 :(得分:0)
它只是一个别名 - 你可以使用你喜欢的任何东西。在您的示例中并不是必需的,但是对于连接多个表的更复杂的示例,它允许您引用特定表的属性。例如:
SELECT A from tableA A, tableB B where B.someId=A.id;