【问题标题】:Why "SELECT c" instead of "SELECT * " in JPQL?为什么在 JPQL 中使用“SELECT c”而不是“SELECT *”?
【发布时间】:2016-04-16 00:19:58
【问题描述】:

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

SELECT c FROM Customer c;

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

SELECT * FROM customer;

我知道我们可以使用这个 c 作为别名,即在 WHERE 子句中像这样:

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

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

【问题讨论】:

    标签: hibernate jpa jpql


    【解决方案1】:

    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 * 也被认为是不好的做法:查询返回的列可能比实际需要的多,您现在不需要列的顺序,而是依赖列在结果集中的名称,而不是在查询中指定所需的名称。

    【讨论】:

    • 嗯我想我明白了所有这些,我知道不应该使用“*”,但我仍然不知道“从学校学校选择学校”中的学校是什么。我可以说它是别名、对象还是没有定义?
    • 是的,它是一个别名。如果我没记错的话,规范使用的确切术语是“标识变量”。注意也可以写select school from School AS school.
    猜你喜欢
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多