自定义查询方法返回Object []而不是实体List

时间:2017-07-29 23:38:36

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

我在实体上调用查询方法,它返回Object[]而不是List<EntityName>我不知道为什么。

我有一个带有默认构造函数,getter和setter的实体。 getter用@Column(name="field name")注释。

现在我有和CRUD这样的存储库:

@Transactional
public interface MyCrudRepo extends BaseCrudRepo <EntityClassName> {
  @Query("SELECT field1,field2,id FROM EntityClassName WHERE field1 = :param1 AND field2 = :param2")
      List<EntityClassName> queryMethod(
      @Param("param1") String param1,
      @Param("param2") String param2, Pageable page); 

所以我在调用方法时尝试获取List<EntityClassName>,但它返回Object[]我不知道该怎么做。

我也尝试过:

@Query("SELECT ec FROM EntityClassName ec WHERE field1 = :param1 AND field2 = :param2")

但是我得到了一个查询验证异常

当我在findAll()实例上调用MyCrudRepo方法时,它会返回List<EntityClassName>预期的

可能是因为EntityClassName类中没有构造函数吗?

1 个答案:

答案 0 :(得分:1)

看起来您的第二个查询“非常正确”,但要访问实例的字段,实例名称(ec)将被遗漏。因此,请考虑使用以下定义:

public interface MyCrudRepo extends BaseCrudRepo<EntityClassName> {
    @Query(
        "SELECT ec FROM EntityClassName ec " +
        "WHERE ec.field1 = :param1 AND ec.field2 = :param2")
    List<EntityClassName> queryMethod(
        @Param("param1") String param1,
        @Param("param2") String param2,
        Pageable page
    ); 
}

实体类的
  

可能是因为EntityClassName类中没有构造函数吗?

根据JPA 2.1规范(JSR 338: Java™ Persistence 2.1, Final Release),第23页必须有一个无参数构造函数:

  

实体类必须具有无参数构造函数。实体类也可以有其他构造函数。 no-arg构造函数必须是公共的或受保护的。