【问题标题】:Sprindg data repository fails to return DTOSpringdg 数据存储库无法返回 DTO
【发布时间】:2017-11-08 04:22:12
【问题描述】:

我有一个简单的 spring JPA 存储库,它有一个需要在 DTO 列表中返回结果的方法。

public interface EmployeeRepository extends JpaRepository<Employee, Integer> {

    @Query(value = "SELECT new com.project.jpa.entity.EmployeeDTO(e.name, r.roleName) FROM Employee e JOIN e.role r")
    List<EmployeeDTO> getEmployee_1();

    @Query("SELECT new EmployeeDTO(e.name, r.roleName) FROM Employee e JOIN e.role r")
    List<EmployeeDTO> getEmployee_2();

    @Query(value = "SELECT new EmployeeDTO(e.name, r.roleName) FROM Employee e JOIN e.role r")
    List<EmployeeDTO> getEmployee_3();

}

您在上面看到的三种方法是我试图获得结果的三种变体。但是这三个都失败并引发了以下错误。

Caused by: java.lang.ClassCastException: org.hibernate.hql.internal.ast.tree.SqlNode cannot be cast to org.hibernate.hql.internal.ast.tree.PathNode

我在这里做错了吗?

这是我的 DTO

public class EmployeeDTO {

    private String name;
    private String roleName;

    public EmployeeDTO (String name, String roleName) {
        this.name = name;
        this.roleName = roleName;
    }

    /*
        Getters and setters
    */
}

【问题讨论】:

  • 这听起来像你有冲突的依赖版本。发布您的 POM/构建文件
  • 看起来不像 EmployeeDTO 类可以编译。
  • @EvanJones 我的错。修复类
  • @chrylis 实体和存储库位于不同的模块中。我已经发布了两者的pom
  • 将两者分开是非常罕见的做法。我注意到您正在使用明显过时的依赖项;您不使用 Spring BOM(或者更好的是 Boot)是否有原因?

标签: java spring hibernate spring-data spring-data-jpa


【解决方案1】:

在创建存储库类时,需要传递具有 DTO 对象标识符的相同 DTO 对象

公共接口 EmployeeRepository 扩展 JpaRepository {

//如果您需要检索所有员工,那么只需在下面尝试

@Query("FROM EmployeeDTO e")
List<EmployeeDTO> getEmployee_1();

//如果您需要在特定条件下检索员工,请尝试以下操作

@Query("FROM EmployeeDTO e where e.roleName =:roleName")
List<EmployeeDTO> getEmployeeByRoleName(@Param("roleName") String roleName);

}

【讨论】:

    猜你喜欢
    • 2011-07-01
    • 2021-05-31
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2021-04-23
    • 2015-08-03
    • 1970-01-01
    相关资源
    最近更新 更多