【问题标题】:Native Query on JPA with Random Entity class使用随机实体类在 JPA 上进行本机查询
【发布时间】:2019-11-09 21:09:55
【问题描述】:

我试图了解 nativeQuery 与 spring data JPA 的使用。考虑关注我从USER 表中提取USER_NAME 的位置。

公共接口 UserRepository 扩展 JpaRepository {

  @Query(value = "SELECT USER_NAME FROM USER WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
  String findByEmailAddress(@Param("emailAddress") String emailAddress );
}

一切都很好。现在在同一个界面上,我可以添加如下方法,它是从SOME_OTHER_TABLE 提取的,它不会与实体类User 匹配。

@Query(value = "SELECT USER_NAME FROM SOME_OTHER_TABLE WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
  String findByEmailAddress(@Param("emailAddress") String emailAddress );
}

这也很好用。现在我真正的问题是为什么我们需要User 实体类,如果它与native query 无关。我们只是想确保代码能够正确编译吗?这是否也意味着我什至可以放置任何entity 类,例如JpaRepository<SOmeRandomEntityClass, Long>,并且仍然可以使用。

【问题讨论】:

    标签: sql spring-boot spring-data-jpa nativequery


    【解决方案1】:

    本机查询的使用使得不必使用实体,例如,您可以放置​​任何与 SqlDeveloper 一起使用的查询,但从我的角度来看,这与 JPA 理念背道而驰。

    独立于 DBMS 工作的强大数据访问框架。

    例如,本机允许您使用本机 MySQL 或 Oracle 函数, 但从 DBMS 迁移时,您必须检查所有本机查询。

    但是,对于命名查询或 Criteria Builder,您将使用允许的函数或允许的方法,它们将是您可以在所有 DBMS 中使用的那些

    为此,您必须使用命名查询或 CriteriaBuilder, 满足您对实体和元模型的需求

    【讨论】:

      【解决方案2】:

      本机查询适用于 jpa 提供的面向对象方法不够灵活的极端情况。本机查询只是一个 SQL 查询,无法使用您的对象结构。

      要回答您的问题,是的,您可以在技术上将此查询添加到任何存储库。存储库中的本机查询支持能够使用任意 SQL 代码扩展存储库功能。

      请注意,如果您设置 native = false,您可以使用 jpql 查询,这让您可以在查询中使用您的实体结构。 请注意,如果将返回类型更改为 List,则可以完全省略 @query 注释。 Spring 将自动实现该方法。 (假设 emailAddress 是 User 的属性)

      【讨论】:

        猜你喜欢
        • 2020-06-01
        • 2015-07-24
        • 2013-05-24
        • 2011-01-09
        • 2022-01-05
        • 1970-01-01
        • 2016-05-31
        • 1970-01-01
        • 2011-03-20
        相关资源
        最近更新 更多