You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data查询@ElementCollection数据及返回非实体类问题

问题2:返回List报错的解决方法

原因

普通Spring JPA只负责数据查询,直接返回原始结果;但Spring Data REST需要将结果转换为符合HAL规范的REST资源,它只支持处理带有@Entity注解的实体类,而String不是实体,所以会抛出Couldn't find PersistentEntity for type class java.lang.String错误。

解决方法

方法1:使用Projection(最简单)

创建一个仅包含需要返回字段的投影接口:

public interface UserNameProjection {
    String getFirstName();
}

修改Repository方法返回投影类型:

@Query("select usr.firstName as firstName from User usr " +
       "where usr.firstName LIKE :username% OR usr.lastName LIKE :username%")
List<UserNameProjection> fetchUsersByName(@Param("username") String username);

Spring Data REST会自动将查询结果转换为投影接口的实例,返回包含firstName字段的JSON。

方法2:绕过Spring Data REST,自定义Controller

如果不需要HAL格式的响应,可以把Repository方法标记为不导出,然后自己写Controller调用:

// Repository里标记方法不导出
@RestResource(exported = false)
@Query("select usr.firstName from User usr " +
       "where usr.firstName LIKE :username% OR usr.lastName LIKE :username%")
List<String> fetchUsersByName(@Param("username") String username);

// 自定义Controller
@RestController
@RequestMapping("/api/custom")
public class UserCustomController {
    private final UserRepository userRepository;

    public UserCustomController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @GetMapping("/users/names")
    public List<String> getUsersByName(@RequestParam String username) {
        return userRepository.fetchUsersByName(username);
    }
}

请求URL改为http://localhost:8080/api/custom/users/names?username=Thom即可返回纯字符串列表。


内容的提问来源于stack exchange,提问作者Shoreki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:40:33