【问题标题】:JPA -- named-query vs queryJPA——命名查询与查询
【发布时间】:2026-01-04 15:25:03
【问题描述】:

执行 SQL 查询的一种方法是在 JPA 中定义 NamedQuery

Query query = entityManager.createNamedQuery("Users.findByName");

另一种方法是在不定义 NamedQuery 的情况下运行它:

Query query = entityManager.createQuery("SELECT SELECT u FROM Users u");

据我所知,NamedQuery 是有利的,因为它是在实体类中的一个地方定义的,并且可以在不需要进入 SQL 的情况下使用它的 pojo .

这两者有什么区别吗?

【问题讨论】:

    标签: sql jpa


    【解决方案1】:

    唯一的区别是一个字符串只能在声明的类中使用,这是你的第二个例子

    Query query = entityManager.createQuery(" SELECT u FROM Users u");
    

    NamedQueries 可以在不同的 DAO 中使用,无需再次定义它们,只需调用 PersistenceProvider 将使用 @NamedQueries - @NamedQuery 或定义它们时的 xml 文件找到它们。

    基本上,命名查询是组织查询的强大工具 定义和提高应用程序性能。

    还有一个重要的事情是,一些提供者在启动时处理了命名查询中的 JPQL,这会影响性能,在您在问题中设置的第二种情况下,持久性提供者不知道查询存在并且在启动时没有机会处理它,需要在需要时运行该进程。

    【讨论】:

    • 您的最后一段很可能是第二种情况的优势 - 当仅在该 pojo 中需要特定查询(如果在运行时涉及该查询)并且因此不会减慢启动速度通过在命名查询中解析所有内容。
    • 是的,除非它是一个动态查询,否则可能会发生这种情况,因为该提供者无能为力,而且我不确定如果查询不是在运行时会发生这种情况标有 NamedQuery,据我所知,提供程序不会扫描可以在启动时在 POJO 中查询的字符串