You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为@NamedNativeQueries列表中的每个@NamedNativeQuery创建对应方法?

如何为@NamedNativeQueries列表中的每个@NamedNativeQuery创建对应方法?

嘿,我来帮你搞定这个问题!针对你现有的这些@NamedNativeQueries,给每个创建对应的仓库方法其实很清晰,下面一步步给你讲明白:

首先,得确保你的仓库接口继承了正确的父接口,比如JpaRepository<你的实体类, 主键类型>——这是Spring Data JPA的基础,只有继承这类接口,才能自动关联命名查询和仓库方法。

接下来核心规则很直接:仓库方法的名称要和@NamedNativeQueryname属性完全一致,同时方法的返回类型必须和SQL查询的结果匹配。我拿你给出的示例代码改造一下,给你一个完整的参考:

@Repository
@NamedNativeQueries({
    @NamedNativeQuery(name = "query1", query = "SELECT * from STUFF where 1=1"),
    @NamedNativeQuery(name = "query2", query = "select distinct * from something"),
    @NamedNativeQuery(name = "query3", query = "select count(*) from some_table")
})
public interface StuffRepository extends JpaRepository<Stuff, Long> {
    // 对应query1的方法,返回Stuff实体的列表
    List<Stuff> query1();

    // 对应query2的方法,返回去重后的Stuff列表
    List<Stuff> query2();

    // 对应query3的方法,返回统计数,用Long类型避免溢出
    Long query3();
}

这里有几个关键注意点我得给你划重点:

  • 返回类型必须精准匹配:比如query3是查count(*),返回类型就得是Long;如果你的SQL只返回某个单独字段(比如SELECT name from STUFF),那方法返回类型可以是List<String>;如果是多字段的自定义结果,要么用投影接口,要么给DTO类加构造函数,然后在@NamedNativeQuery里用resultClassresultSetMapping指定返回类型。
  • 带参数的查询怎么处理?要是你的命名查询带参数,比如:
    @NamedNativeQuery(name = "queryById", query = "SELECT * from STUFF where id = ?1")
    
    对应的方法就要加匹配的参数:
    Stuff queryById(Long id);
    
    要是用命名参数(SQL里写:paramName),那方法参数要加@Param注解绑定:
    @NamedNativeQuery(name = "queryByName", query = "SELECT * from STUFF where name = :stuffName")
    
    方法定义:
    List<Stuff> queryByName(@Param("stuffName") String name);
    
  • 如果不想用查询名当方法名?也可以实现,你可以用@Query注解并指定nativeQuery = true,把SQL直接写进去,但这样就浪费了你已经定义好的@NamedNativeQueries配置,所以更推荐用查询名对应方法名的方式,保持代码整洁统一。

最后再确认下:Spring Data JPA会自动识别仓库方法名和@NamedNativeQueryname属性,只要两者一致,就会自动调用对应的原生SQL查询,完全不用额外的配置步骤。

内容来源于stack exchange

火山引擎 最新活动