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

如何通过Jpa Repository原生SQL查询映射获取关联用户的Product列表

解决方案

首先,你的原生SQL查询存在两个核心问题:

  1. 原生SQL不支持JPQL的new 实体类(...)构造器语法,原生查询直接返回数据库结果集,需依赖JPA自动映射到实体。
  2. WHERE子句的子查询语法错误,SQL中没有大括号包裹子查询的写法,需改用IN或关联查询。

正确的原生SQL查询实现

推荐使用JOIN关联中间表的方式(性能优于子查询):

@Query(value = "SELECT p.* FROM PRODUCT p " +
               "JOIN USERS_PRODUCTS up ON p.ID = up.PRODUCT_ID " +
               "WHERE up.USER_ID = :id", nativeQuery = true)
List<Product> findAllProductsById(@Param("id") Long id);

如果偏好子查询写法,也可以这样写:

@Query(value = "SELECT p.* FROM PRODUCT p " +
               "WHERE p.ID IN (SELECT PRODUCT_ID FROM USERS_PRODUCTS WHERE USER_ID = :id)", nativeQuery = true)
List<Product> findAllProductsById(@Param("id") Long id);

关键注意事项

  1. 字段映射校验:
    JPA默认会将实体驼峰属性转换为下划线命名的数据库字段(如imageURL → image_url),如果你的数据库字段是大写无下划线格式(如IMAGEURL),需要给实体属性添加@Column注解指定对应字段名,避免映射失败:

    @Column(name = "IMAGEURL")
    private String imageURL;
    
    @Column(name = "PRODUCT_CODE")
    private Long productCode;
    
    @Column(name = "PRODUCT_NAME")
    private String productName;
    
    @Column(name = "PRODUCT_CATEGORY")
    @Enumerated(EnumType.STRING) // 若数据库存储枚举字符串值,需添加此注解
    private ProductCategory productCategory;
    
  2. 枚举类型映射:
    ProductCategory作为枚举类型,需明确存储格式(字符串或序数),添加@Enumerated(EnumType.STRING)确保和数据库字段类型匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:43:12