Spring JPA仓库转换器未找到。

3

我有一个实体类UserModel.java

@Entity
@Table
@Data
@EqualsAndHashCode( of = { "id" } )
@ToString( of = { "id" } )
public class UserModel {

@Id
@GeneratedValue( strategy = GenerationType.AUTO )
@Column( name = "u_id" )
private Long id;

@Column( name = "u_first_name" )
private String firstName;

@Column( name = "u_last_name" )
private String lastName;

@Column( name = "u_email_id" )
private String emailId;

@Column( name = "u_password" )
private String password;

@Column( name = "u_mobile_number" )
private String mobileNumber;

@Column( name = "u_created_at" )
private Calendar createdAt;

@Column( name = "u_is_active" )
private Boolean isActive;

@Column( name = "u_reason" )
private String reason;


}

我需要基于每列中包含的值来获取一些统计数据。所以我创建了一个 JPQL 查询,并将结果映射到一个名为 UserStatisticsModel.java 的另一个 Entity 类。

@Data
@Entity
public class UserStatisticsModel {

@Id
@Column
private Integer id;

@Column
private Integer activeUsers;

@Column
private Integer suspendedUsers;

@Column
private Integer removedUser;
}

我创建了一个仓库类来执行查询。

public interface UserStatisticsRepository extends JpaRepository<UserStatisticsModel, Integer> {

@Query( " Select sum(case when u.isActive is true then 1 else 0 end) as activeUsers, "
        + " sum(case when u.isSuspended is true then 1 else 0 end) as suspendedUsers, "
        + " sum(case when u.isActive is false then 1 else 0 end) as removedUser"
        + " from UserModel u " + " where u.accountStatus <>5" )
UserStatisticsModel getUserStatistics();

但是在执行查询时,我遇到了异常。虽然根据日志记录,查询已经执行并且值是正确的,但是映射失败了。

Caused by: org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.Integer] to type [com.highpeak.tlp.datastore.model.UserStatisticsModel]
at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:324)
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:206)
at org.springframework.core.convert.support.ArrayToObjectConverter.convert(ArrayToObjectConverter.java:66)
at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:37)
... 125 common frames omitted

有人能解释一下这个错误是什么以及如何修复吗?

可用的解决方案:

  1. 我可以在UserModel.java中创建那些字段,但我不想在那个类中创建那些字段。

  2. 我也可以创建一个本地查询,它会起作用。

更新 如果我将查询的返回类型更改为List<Integer>,我就不会收到任何异常,并且我会得到正确的结果。但是为什么我不能将这些整数映射到我的@EntityUserStatisticsmodel.java的字段中呢?


2
它告诉你的问题是:你没有定义一个转换器将整数转换为UserStatisticsModel。 - Roddy of the Frozen Peas
除非您有某些特定原因不打算这样做,否则您可能还需要考虑在@Query上设置nativeQuery=true - Roddy of the Frozen Peas
@RoddyoftheFrozenPeas 如何定义转换器? - Naanavanalla
这不是本地查询。如果我将其设置为true,它将起作用。但我想使用JPQL - Naanavanalla
这个问题解决了吗?我也遇到了同样的问题。我的(本地)SQL语句返回一个有6列的行,在Java中它们显示为Object[]数组,然后ArrayToObjectConverter只取第一列并尝试将其转换为我的目标类型,这当然会失败。 - Ruik
好的,我解决了我的问题。由于类型不匹配,我得到了完全相同的异常。我在JpaRepository<TypeA, String>中有一个TypeB selectQuery(...)方法。在这种情况下,“找不到转换器”错误并不是很有帮助。 - Ruik
2个回答

0

你的问题在于查询。你说要选择 Select 1 as id 但你想返回一个 UserStatisticsModel。所以你需要修复查询或者将方法签名改为返回 Integer


idUserStatisticsModel.java 类中的一个字段。ORM 应该将 1 映射为 id,对吗? - Naanavanalla
如果我将返回类型更改为“整数”,那么我只会得到一个值,即sum(case when u.isActive is true then 1 else 0 end) as activeUsers的结果,那么我该如何获取查询中其余“聚合”值的值? - Naanavanalla

0
如@Babajide M. Moibi所提到的,尝试将您的查询更改为:Select 1 as id,sum(case when u.isActive is true then 1 else 0 end) as activeUsers....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接