Java 具有SqlResultSetMapping和本机查询的JPA数据存储库

Java 具有SqlResultSetMapping和本机查询的JPA数据存储库,java,spring,spring-data-jpa,nativequery,sqlresultsetmapping,Java,Spring,Spring Data Jpa,Nativequery,Sqlresultsetmapping,我遇到了以下情况: 我的实体是相互关联的,但是以这样一种方式,我不能使用JPQL。我被迫使用本机SQL。现在我想将这些结果映射到ValueObject。我不想得到对象数组的列表(list)。我有6个实体,从中我只需要一些列。有人能给我举个例子说明如何从本机查询实现这种映射吗 我经历过的 我的代码: @SqlResultSetMapping( name = "findAllDataMapping", classes = @ConstructorResult(

我遇到了以下情况:

我的实体是相互关联的,但是以这样一种方式,我不能使用JPQL。我被迫使用本机SQL。现在我想将这些结果映射到ValueObject。我不想得到对象数组的列表(
list
)。我有6个实体,从中我只需要一些列。有人能给我举个例子说明如何从本机查询实现这种映射吗

我经历过的

我的代码:

@SqlResultSetMapping(
    name = "findAllDataMapping",
    classes = @ConstructorResult(
            targetClass = MyVO.class,
            columns = {
                    @ColumnResult(name = "userFirstName"),
                    @ColumnResult(name = "userLastName"),
                    @ColumnResult(name = "id"),
                    @ColumnResult(name = "packageName")
            }
    )
)

@NamedNativeQuery(name = "findAllDataMapping",
    query = "SELECT " +
            "    u.first_name as userFirstName, " +
            "    u.last_name as userLastName, " +
            "    i.id as id, " +
            "    s.title as packageName, " +
            "FROM " +
            "    invoice as i " +
            "JOIN user as u on i.user_id=u.id " +
            "LEFT JOIN subscription_package as s on i.subscription_package_id=s.id " +
            "where  u.param1=:param1 and i.param2=:param2" +
)

public class MyVO {
    private String userFirstName;
    private String userLastName;
    private Long id;
    private String packageName;

    public MyVO (String userFName, String userLName,
            Long id, String packageName) {
        this.userFirstName = userFName;
        this.userLastName = userLName;
        this.id = id;
        this.packageName = packageName;
    }

    // getters & setters
}
在我的jpa存储库模块中:

public interface MyRepository extends JpaRepository<MyEntity, Long> {
    List<MyVO> findAllOfMyVO(@Param("param1") String param1, @Param("param2") String param2);
}
我想我的问题很清楚。如果没有,请告诉我,以便我可以编辑我的问题


提前谢谢

您需要将查询标记为查询:) 您需要使用MyVO而不是MyEntity,因为这是您将结果映射到的实体

@Repository
public interface MyRepository extends JpaRepository<MyVO, Long> {

    @Query(nativeQuery = true)
    List<MyVO> findAllOfMyVO(@Param("param1") String param1, @Param("param2") String param2);
}
@存储库
公共接口MyRepository扩展了JpaRepository{
@查询(nativeQuery=true)
列出findAllOfMyVO(@Param(“param1”)字符串param1,@Param(“param2”)字符串param2);
}

您就快到了,但对于以下部分

  • 整个
    @SqlResultSetMapping
    @NamedNativeQuery
    必须 存在于实体中,而不是值对象中。在您的情况下,它应该在MyEntity类中,**而不是**MyVO类中。这将解决您的异常
  • 这仍然不行。完成上述操作后,请更改以下内容

    @NamedNativeRequesty(name=“findAllDataMapping”, 到
    @NamedNativeRequesty(name=“MyEntity.findAllDataMapping”

  • 最后,在某些情况下,您需要明确定义@ColumnResult(name=“userFirstName”)。如果它是一个类似ZonedDateTime或Boolean的复杂字段,您可能需要明确说明@ColumnResult(name=“date\u created”,type=ZonedDateTime.class)


  • 希望有帮助。

    添加缺少的resultClass

    @NamedNativeQuery(name = "findAllDataMapping", resultClass = Entity.class, query="sql")
    

    最后调用存储库中的查询

    @Query(nativeQuery = true, name = "findAllDataMapping")
    List<MyVO> findAllOfMyVO(@Param("param1") String param1, @Param("param2") String param2);
    
    @Query(nativeQuery=true,name=“findAllDataMapping”)
    列出findAllOfMyVO(@Param(“param1”)字符串param1,@Param(“param2”)字符串param2);
    
    答案就在这里:一些注释似乎已经过时。我查看了此页面以使它们正常工作。对不起,@Urosh T。我知道您的答案是2012年的。我正尝试这样做,但当存储库初始化时,我得到错误“非托管类型”即使我没有声明任何方法,你知道为什么吗?Thanks@elamas,从今年9月12日开始:)
    “不是托管类型”
    可能意味着Spring没有扫描您的@Entity类或包含该类的包。请确保您的
    应用程序.properties
    行中有
    entitymanager.packagesToScan=com.mypack.Entity
    您好@Urosh t,您是对的,“今年9月12日:”。我认为问题在于MyVO类不是一个实体。但是别担心,我找到了另一个解决方案,谢谢。你是如何解决
    不是托管类型的问题的,@elamas?在我的例子中,MyVO确实不是一个实体,但我还是想将查询结果映射到MyVO。这对我@NamedNativeRequesty(name=“MyEntity.findAllDataMapping”)不起作用,而是按照Michelan Arendse的建议@NamedNativeRequesty(name=“findAllDataMapping”,resultClass=MyVO.class,ResultMapping=“findAllDataMapping”query=“sql”)
    
    @NamedNativeQuery(name = "findAllDataMapping", resultClass = MyVO.class, resultSetMapping ="findAllDataMapping" query = "sql")
    
    @Query(nativeQuery = true, name = "findAllDataMapping")
    List<MyVO> findAllOfMyVO(@Param("param1") String param1, @Param("param2") String param2);