当前位置: 首页 > 面试题库 >

带Projection的Spring JPA本机查询给出“ ConverterNotFoundException”

衡子安
2023-03-14
问题内容

我正在使用Spring
JPA,我需要一个本机查询。通过该查询,我只需要从表中获取两个字段,因此我尝试使用Projections。它不起作用,这是我得到的错误:

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type [com.example.IdsOnly]

我试图严格按照所链接页面的说明进行操作,试图使查询为非本地查询(如果我使用投影,我是否真的需要将查询设为本地查询,顺便说一句?),但我总是会遇到该错误。
如果使用接口,则可以,但是结果是代理,因此我真的需要它们成为“正常结果”,以便可以将其转换为json。

所以,这是我的代码。实体:

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@Entity
@Table(name = "TestTable")
public class TestTable {

    @Id
    @Basic(optional = false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "Id")
    private Integer id;
    @Column(name = "OtherId")
    private String otherId;
    @Column(name = "CreationDate")
    @Temporal(TemporalType.TIMESTAMP)
    private Date creationDate;
    @Column(name = "Type")
    private Integer type;
}

投影的类别:

import lombok.Value;

@Value // This annotation fills in the "hashCode" and "equals" methods, plus the all-arguments constructor
public class IdsOnly {

    private final Integer id;
    private final String otherId;
}

仓库:

public interface TestTableRepository extends JpaRepository<TestTable, Integer> {

    @Query(value = "select Id, OtherId from TestTable where CreationDate > ?1 and Type in (?2)", nativeQuery = true)
    public Collection<IdsOnly> findEntriesAfterDate(Date creationDate, List<Integer> types);
}

以及试图获取数据的代码:

@Autowired
TestTableRepository ttRepo;
...
    Date theDate = ...
    List<Integer> theListOfTypes = ...
    ...
    Collection<IdsOnly> results = ttRepo.findEntriesAfterDate(theDate, theListOfTypes);

谢谢您的帮助。我真的不明白我在做什么错。


问题答案:

借助弹簧数据,您可以削减中间人并简单地定义

public interface IdsOnly {
  Integer getId();
  String getOtherId();
}

并使用本机查询,例如;

@Query(value = "Id, OtherId from TestTable where CreationDate > ?1 and Type in (?2)", nativeQuery = true)
    public Collection<IdsOnly> findEntriesAfterDate(Date creationDate, List<Integer> types);

查看https://docs.spring.io/spring-
data/jpa/docs/current/reference/html/#projections



 类似资料:
  • 我写了原生sql查询,而不是使用hql和面对roblem 超出声明序数参数的位置。记住序数参数是基于1的!职位: 1 和DAO 我读了和hibernate使用0作为第一个索引。 堆栈跟踪 //更新 有趣的是,当我设置查询数值时 我明白了 但是在MySQL中我得到了成功的结果。 我如何决定这个问题?

  • 问题内容: 在一个网络项目中,将最新的spring-data(1.10.2)与MySQL 5.6数据库一起使用,我试图将本机查询与分页一起使用,但是在启动时遇到了问题。 根据spring-data文档中使用的示例50,可以指定查询本身和countQuery,如下所示: 出于好奇,在课堂上我可以看到它包含以下代码来检查其是否为有效的jpa查询: 我的查询中包含一个参数,所以是的,但它也在寻找或序列里

  • 我对Spring中的原生查询有一个问题。我在param value中使用了带有参数nativequery=true注释@query和SQL查询。 而在RezerWacjamanager.java中: 问题是什么时候调用方法RezerWacjadao.getDoStepnosCnatypy(dataOd,dataDo)并执行此查询。我得到一个错误错误: DoStepNosCtypyListdTo.j

  • 就像你可以看到注释“#sort”还在那里一样。 我尝试过Spring Data和带分页的本机查询,但注释还在,而使用另一个语法,如?#{#sort}或{#sort},问题仍然存在。 什么都欢迎。

  • 在一个web项目中,使用最新的spring-data(1.10.2)和MySQL5.6数据库,我试图使用带分页的本机查询,但在启动时遇到的是。 根据示例50,在使用来自spring-data文档的@query时,可以指定查询本身和countQuery,如下所示: 出于好奇,在类中,我可以看到它包含以下代码,以检查它是否是有效的jpa查询: 我的查询包含一个参数,因此是,但它也在中查找一个或序列,我

  • 在我的中,我有以下关系: 在我的中,我现在希望通过按和搜索来获得特定的-我尝试通过: 当我在数据库(H2)中使用这个查询时,它可以工作,但在Java中,我会遇到以下异常: javax.Persistence.persistenceException:Exception[EclipseLink-4002](Eclipse Persistence Services-2.5.0.v20130507-3F