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

NativeQuery映射和@SqlResultSetMapping以及多个@Entity类,是否可能?

蔡晨
2023-03-14

有一种情况是,我有一个本机查询,其中包含两个实体类的数据,如何通过@SqlResultSetMapping将该数据映射到实体类?例如

Native query:- select customer.name, address.area from customer, address where customer.id=address.custid;

2实体类,如客户和地址,名称作为客户中的变量,区域作为地址实体类中的变量。

Customer class:
@Entity
public class Customer {
    @Id
    private String name;
    getters and setters
.....
.....
.....
}

Address Class entity:
@Entity
public class Address{
    @Id
    private String area;
    getters and setters
.....
.....
.....
}

要将本机查询与实体类映射,可以通过在实体中给出@SqlResultSetMap并在nativeQuery中给出映射的名称来完成

Query query = entityManager.createNativeQuery(sbQuery, "checkInfoMapping");

它将检查映射名称并映射到相应的实体类,这可以针对单个实体类来完成。

如果我有来自两个实体类的本机查询的数据,可以这样做吗?如果是,我如何将其映射到具有本机查询的实体类?

共有2个答案

岳正阳
2023-03-14

最简单的方法是在本机查询中使用JOIN,如下所示。

Native query:-在c.id=a.custid上从客户c加入地址a中选择c.name,a.area

因此,您必须在客户实体上提供结果集映射。

滑文昌
2023-03-14

你应该这样做:

@SqlResultSetMapping(
   name = "checkInfoMapping",
   classes = {
      @ConstructorResult(targetClass = ResultInfo.class,
         columns = {
            @ColumnResult(name = "cust_name", type = String.class),
            @ColumnResult(name = "adr_area", type = String.class)
         }
      )
   }
)
@Entity
@Table(name = "TST_CUSTOMER")
public class Customer {

    @Id
    @Column(name = "cust_id")
    private Long id;

    @Column(name = "cust_name")
    private String name;

    ...
}


@Entity
@Table(name = "TST_ADDRESS")
public class Address{

    @Column(name = "adr_area")
    private String area;

    @ManyToOne
    @JoinColumn(name = "adr_cust_id")
    private Customer customer;
    ...
}

// this is not entity, just dto class
public class ResultInfo
{
   private String name;
   private String area;

   public ResultInfo(String name, String area)
   {
      this.name = name;
      this.area = area;
   }
   // ...
}

问题是:

List<ResultInfo> resultList = entityManager.createNativeQuery(
   "select cust_name, adr_area from TST_CUSTOMER, TST_ADDRESS where TST_CUSTOMER.cust_id = TST_ADDRESS.adr_cust_id",
   "checkInfoMapping")
   .getResultList();
 类似资料:
  • 问题内容: 我正在尝试使用@SqlResultSetMapping和@ConstructorResult将本机查询的结果映射到POJO。这是我的代码: 然后在我的DAO中: 我已经读到JPA 2.1仅支持此功能,但这就是我正在使用的功能。这是我的依赖项: 我发现了一些资源,其中包括:jpa2.1中的@ConstructorResult映射。但是我仍然没有运气。 我想念什么?为什么找不到SqlRes

  • 我正在尝试使用@SQLResultSetMapping和@ConstructorResult将本机查询的结果映射到POJO。下面是我的代码: 我找到了一些参考资料,其中包括JPA2.1中的@ConstructorResult映射。但我还是没有运气。 我错过了什么?为什么找不到SqlResultSetMapping?

  • 使用getObject方法从ResultSet对象检索列时,该类由JDBC驱动程序选择。我正在寻找一种方法来选择在运行时检索列的类。 在下面的示例中,使用变量T作为整数创建类型Class1。 ResultSet类提供了一个名为getObject的方法,该方法接受列参数和类型映射参数。此类型映射仅用于UDT(用户定义的类型)。我需要这个功能应用到基本的SQL类型。我知道我可以使用switch/cas

  • 问题内容: 我用np.save()保存了几个numpy数组,并将它们放在一起非常大。 是否可以将它们全部加载为内存映射文件,然后对它们进行串联和切片,而无需将任何内容都加载到内存中? 问题答案: 使用显然将数组加载到内存中。为避免这种情况,您可以轻松地在新文件中创建一个thrid数组,并从要连接的数组中读取值。以更有效的方式,您还可以将新阵列追加到磁盘上已存在的文件中。 在任何情况下,您都必须为数

  • 从这个问题,有可能注入map与枚举? 例如,我有枚举: 我有一些与实现的接口: 但这样的注入不起作用: 我想自动注入。如何修复它,在spring框架端生成这样的代码?

  • 应用:Spring防尘套 我试图用SqlResultSetMapping和NamedNativeQuery将非实体类映射到JPA存储库。 运行应用程序时出现以下错误: 通过字段'cityAddressRepository'表示不满足的依赖关系;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名称为'cityAddress