如何使用 SqlResultSetMapping 将 JPA NativeQuery 的结果集映射到 POJO

新手上路,请多包涵

我正在尝试使用@SqlResultSetMapping 和@ConstructorResult 将本机查询的结果映射到POJO。这是我的代码:

 @SqlResultSetMapping(name="foo",
    classes = {
        @ConstructorResult(
                targetClass = Bar.class,
                columns = {
                    @ColumnResult(name = "barId", type = Long.class),
                    @ColumnResult(name = "barName", type = String.class),
                    @ColumnResult(name = "barTotal", type = Long.class)
                })
    })

public class Bar {

private Long barId;
private String barName;
private Long barTotal;

...

然后在我的 DAO 中:

 Query query = em.createNativeQueryBar(QUERY, "foo");
... set some parameters ...
List<Bar> list = (List<Bar>) query.getResultList();

我读到此功能仅在 JPA 2.1 中受支持,但这正是我正在使用的。这是我的依赖:

         <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.0.Final</version>
        </dependency>

我找到了一些资源,包括这个: @ConstructorResult mapping in jpa 2.1 。但我仍然没有任何运气。

我错过了什么?为什么找不到SqlResultSetMapping?

 javax.persistence.PersistenceException: org.hibernate.MappingException: Unknown SqlResultSetMapping [foo]

原文由 mhlandry 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

@SqlResultSetMapping 不应将注释放在 POJO 上。把它放在(任何) @Entity 类。 “Unknown SqlResultSetMapping [foo]”告诉您,JPA 提供程序在名称“foo”下看不到任何映射。请参阅我的另一个答案以获取正确的示例

原文由 zbig 发布,翻译遵循 CC BY-SA 3.0 许可协议

简短的工作示例:

  • DTO POJO类
  @lombok.Getter
  @lombok.AllArgsConstructor
  public class StatementDto {
      private String authorName;
      private Date createTime;
  }

  • 存储库 bean:
   @Repository
  public class StatementNativeRepository {
      @PersistenceContext private EntityManager em;

      static final String STATEMENT_SQLMAP = "Statement-SQL-Mapping";

      public List<StatementDto> findPipelinedStatements() {
          Query query = em.createNativeQuery(
              "select author_name, create_time from TABLE(SomePipelinedFun('xxx'))",
              STATEMENT_SQLMAP);
          return query.getResultList();
      }

      @SqlResultSetMapping(name= STATEMENT_SQLMAP, classes = {
          @ConstructorResult(targetClass = StatementDto.class,
              columns = {
                  @ColumnResult(name="author_name",type = String.class),
                  @ColumnResult(name="create_time",type = Date.class)
              }
          )
      }) @Entity class SQLMappingCfgEntity{@Id int id;} // <- workaround

  }

原文由 kinjelom 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题