为什么在JPQL中使用“SELECT c”而不是“SELECT *”?

时间:2016-01-11 15:56:22

标签: hibernate jpa jpql

JPQL中的示例查询如下所示:

SELECT c FROM Customer c;

我阅读了JPA规范,书籍,我找不到这个c的含义。在SQL中我们只写:

SELECT * FROM customer;

我知道我们可以将此c用作别名,即在WHERE子句中,如下所示:

SELECT c FROM Customer c WHERE c.name = ...

但是我仍然不明白这个c究竟是什么,如何调用它(别名?对象?)以及为什么它必须在SELECT之后而不是*。

1 个答案:

答案 0 :(得分:5)

SQL返回行,行包含列。

JPQL有点复杂:它可以返回列的行,但也可以返回实体实例。

因此,假设您有一个(无效的)JPQL查询,如

select * from School school
join school.students student
where ...

查询应该返回什么?学校的实例?学生的实例?列?很难知道。假设它返回学校和学生的所有领域,那些领域的顺序是什么?你怎么能用这个结果?

然而,如果你这样做

select school from School school
join school.students student
where ...

你告诉JPQL你想要获得School实体的实例。

如果你这样做

select student from School school
join school.students student
where ...

你告诉JPQL你想要获取Student实体的实例。

如果你这样做

select school.name, student.firstName, student.age 
from School school
join school.students student
where ...

你告诉JPQL你想要获得包含三列的行:学校名称,学生名字和学生年龄。

请注意,即使在SQL中,从程序中使用select *也被认为是不好的做法:查询可能会返回比真正需要的列更多的列,您现在不是列的顺序,而您依赖于列在结果集中的名称,而不是在查询中指定所需的名称。