带有投影的春季 JPA 本机查询给出了“ConverterNotFoundException”

2022-09-01 16:37:43

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

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);  

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


答案 1

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

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


答案 2

查询应使用构造函数表达式

@Query("select new com.example.IdsOnly(t.id, t.otherId) from TestTable t where t.creationDate > ?1 and t.type in (?2)")

我不知道龙目岛,但要确保有一个构造函数将两个ID作为参数。


推荐