JPQL中的示例查询如下所示:
SELECT c FROM Customer c;
我读了JPA规范,书籍,我找不到这个c的含义.在SQL中我们简单地写:
SELECT * FROM customer;
我知道我们可以将此c用作别名,即在WHERE子句中,如下所示:
SELECT c FROM Customer c WHERE c.name = ...
但我仍然不明白这个c究竟是什么,如何调用它(别名?对象?)以及为什么它必须在SELECT之后而不是*.
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 *
从程序中使用它也被认为是不好的做法:查询可能返回的列数多于实际需要的列数,现在不是列的顺序,而是依赖于列所具有的名称结果集,而不是在查询中指定所需的名称.