JPA命名查询“o”?

时间:2012-07-17 20:59:25

标签: database jpa jpql

我很好奇当我试图查询时o代表什么。

默认情况下,我的查询出现为
@NamedQuery (name="newName" query=SELECT o FROM tableView o)

我很好奇o代表的是什么。我已经看到了使用字母xc的几个实例。只是想知道有什么区别,如果有的话。另外,为什么我只能使用*来选择整行?

2 个答案:

答案 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;