当前位置: 首页 > 知识库问答 >
问题:

基于随机实体类的JPA本机查询

闽经纬
2023-03-14

我试图理解nativeQuery与Spring数据JPA的使用。考虑以下是从USER表中拉出USER_NAME的位置。

公共接口用户存储库扩展了JpaRepository{

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

一切都很好。现在,在同一个界面上,我可以添加如下方法,其中它是从某个_其他_表中提取的,它将与实体类用户不匹配。

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

A这也很好用。现在我真正的问题是,如果实体类与本机查询无关,为什么我们需要用户实体类。我们只是想确保代码能够正确编译吗?这是否意味着我甚至可以将任何实体类放入JpaRepository


共有2个答案

柴嘉石
2023-03-14

本机查询适用于jpa提供的面向对象方法不够灵活的角落情况。本机查询只是一个SQL查询,没有办法利用你的对象结构。

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

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

包谭三
2023-03-14

本机查询的使用使得不必使用实体,例如,您可以使用任何与SqlDeveloper一起工作的查询,但在我看来,这与JPA的理念不同。

一个独立于DBMS工作的健壮的数据访问框架。

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

但是,对于命名查询或条件生成器,您将使用允许的函数或允许的方法,这些函数或方法可以在所有DBMS中使用

要做到这一点,您必须使用命名查询或CriteriaBuilder,因为您需要实体和元模型

 类似资料:
  • 此外,该实体需要一个id,我希望让jpa自动生成它,但我得到的是“Invalid Parameter:Unknown column name id.errorcode=-4460,sqlstate=null” 我的结果集包含4个相同的记录,而不是4个不同的记录,我认为这与我的id字段设置不正确有关 如果你能在这方面提供帮助,我将不胜感激,谢谢。

  • 问题内容: 我有一个实体类和一个基于该实体的子类: 和 我需要发出仅在基类(A)上使用存储过程的本机查询。如果我尝试如下: 我收到有关“在ResultSet中未找到clazz_列”的错误。我假设JPA提供程序添加了此列,以便区分基类和扩展类。我可以通过显式添加clazz列和子类中的所有字段来解决此问题: 其中“ prop1”和“ prop2”是子类B的属性。但是,这似乎是不必要的修改,并且如果子类

  • 我是JPA新手。目前,我正在编写一个带有注释的本机查询。我有一个类似下面的类 我正在编写两个查询,其中一个查询在选择投影中包含字段2,而另一个不包含字段2。如何对这两个查询使用相同的类?我尝试了瞬态注释。但它使两个查询的值都为null。

  • 当使用jpa本机查询 事务传播是我们正在使用的正确jpa的唯一特性吗? 在我的意见中,我就像使用普通的旧jdbc pluc jpa事务传播 我正在阅读PRO JPA一书,根据我的理解 当我们使用JPA本机查询获取一组标量值时(与我们使用jdbc的方式很相似),实际上没有托管实体和持久性上下文的概念。当我们通过本机查询检索实体时,情况会发生变化。

  • 我有一个复杂的本机查询,我正在尝试将其结果映射到非实体DTO类。我正在尝试使用的with 我的DTO类 我的entity类,它具有我将调用此本机查询结果的存储库接口。 存储库 当我从ItemRepository调用getItemDetails()时,出现以下错误: org.springframework.data.mapping.属性引用异常:没有属性项找到项目类型的详细信息 使用和并解决此问题的

  • 我试图编写一个方法rollDice(int number,int nSides),它返回用nSides边滚动数字骰子的总结果。