java 使用SqlResultSetMapping和本机查询的JPA数据存储库

pkwftd7m  于 2023-03-28  发布在  Java
关注(0)|答案(4)|浏览(142)

我陷入了以下情况:
我的实体是相互关联的,但是我不能使用JPQL。我被迫使用原生SQL。现在我想将这些结果Map到一个ValueObject。为了清楚起见,我不想获得一个Object数组列表(List<Object[]>)。我有6个实体,我只需要其中的一些列。有人能给予我一个例子,说明如何从原生查询实现这样的Map吗?
Tutorial我经历过的。
我的代码:

@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-repository模块中:

public interface MyRepository extends JpaRepository<MyEntity, Long> {
    List<MyVO> findAllOfMyVO(@Param("param1") String param1, @Param("param2") String param2);
}

关键是我不知道在哪里放置这些注解,所以我可以使用这种Map。在原生查询中,我不能使用new rs.rado.leo.mypackage.MyVO(...)。我得到了以下错误:
原因:

org.springframework.data.mapping.PropertyReferenceException: No property findAllOfMyVO found for type MyEntity!

我想我的问题已经很清楚了。如果还不清楚,请告诉我,这样我就可以编辑我的问题了。
先谢了!

fcy6dtqo

fcy6dtqo1#

添加缺少的resultClass

@NamedNativeQuery(name = "findAllDataMapping", resultClass = Entity.class, 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);
apeeds0o

apeeds0o2#

你几乎是在那里,但对于以下部分
1.整个@SqlResultSetMapping@NamedNativeQuery必须存在于Entity中,而不是值Object中。在您的情况下,它应该在MyEntity类中,而不是MyVO类。这应该可以解决您的异常。
1.那还不行,你把上面的做完了,把下面的改一下
@NamedNativeQuery(name =“findAllDataMapping”,to
@NamedNativeQuery(name =“MyEntity.findAllDataMapping”,
1.最后,在某些情况下,您需要显式定义@ColumnResult(name =“userFirstName”)。如果它是一个复杂的字段,如ZonedDateTime或Boolean,您可能必须显式声明@ColumnResult(name =“date_created”,type = ZonedDateTime.class)。
希望能有所帮助。

gg0vcinb

gg0vcinb3#

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

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

    @Query(nativeQuery = true)
    List<MyVO> findAllOfMyVO(@Param("param1") String param1, @Param("param2") String param2);
}
4xrmg8kj

4xrmg8kj4#

您的@NamedNativeQuery缺少属性“resultClass”和“resultSetMapping”,如下面的示例:

@NamedNativeQuery(name = "YourEntity.findAllDataMapping",
                resultClass =  MyVO.class ,
                resultSetMapping ="findAllDataMapping",
                query = "SELECT ..."
        )

相关问题