sw芒ee果t 2024-03-21 14:06 采纳率: 50%
浏览 164

springDataJpa中使用 @Param出现无法匹配命名参数问题和@Column(name = "")未生效问题

出现的问题:For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters.; nested exception is java.lang.IllegalStateException: For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters.
CharGTP3.5回答:
这个错误提示表明在使用具有命名参数的查询时,需要为方法参数提供名称。如果你在方法参数中使用了命名参数,但出现了这个错误,可能是因为编译器没有正确识别方法参数的名称,无法匹配命名参数。

针对这个问题,你可以尝试以下解决方法:

使用@Param注解:确保在需要使用命名参数查询的方法参数上添加@Param注解,并为每个参数指定名称。例如:public void yourQueryMethod(@Param("paramName") String param)。

检查Java编译器参数:确保项目是在Java 8+环境下编译的,并已经启用了编译参数 -parameters。这个参数会确保编译器在编译时保留方法参数的名称信息,有助于正确匹配命名参数。

查看查询语句:检查你的查询语句是否正确使用了命名参数,并且参数名称与方法参数名称一致。确保参数名称在查询语句中正确匹配。

重启编译器和IDE:有时候重新启动编译器和IDE可以帮助解决一些编译时出现的问题,尝试重新启动看看是否有帮助。

更新相关依赖:如果是使用ORM框架或者其他依赖库进行查询操作,考虑更新相关依赖库到最新版本,以确保没有已知的问题。

相关代码:

    //jpa中实现的方法
    @Modifying
    @Query("update Cinema c set c.avatarId = :avatarId where c.cinemaId = :id")
    void updateAvatarIdById(@Param("id") int id, @Param("avatarId") String avatarId);

实体类,其中@Table(name = "cinema")和 @Column(name = "")注解没有生效,@Column(name = "")这些指定的是数据库的字段,之前数据库中cinema_id字段就名称是cinemaId,但是由于hibernate中用驼峰命名法解析一直把cinemaId解析成cinema_id,数据库才不得不改成cinema_id。

@Entity
@Table(name = "cinema")
public class Cinema {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "cinema_id")
    private int cinemaId;
    private String name;
    private String location;
    private String brand;
    @Column(name = "administrative_district")
    private String administrativeDistrict;
    private String type;
    private String rebook;
    @Column(name = "return_ticket")
    private String returnTicket;
    private String price;
    private String phone;
    @Column(name = "avatar_id")
    private String avatarId;

这是测试用例

    @Test
    void test005(){
        cinemaRepository.updateAvatarIdById(1,"123isjcmrhs512wk");
    }

  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-03-21 14:06
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题描述: 在使用具有命名参数的查询时,需要为方法参数提供名称,否则会出现异常信息:For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters. 解决方法:
    1. 使用@Param注解:为需要使用命名参数查询的方法参数添加@Param注解,并为每个参数指定名称。例如:public void yourQueryMethod(@Param("paramName") String param)。
    2. 检查Java编译器参数:确保项目是在Java 8+环境下编译的,并已经启用了编译参数-parameters。这个参数会确保编译器在编译时保留方法参数的名称信息,有助于正确匹配命名参数。
    3. 查看查询语句:检查你的查询语句是否正确使用了命名参数,并且参数名称与方法参数名称一致。确保参数名称在查询语句中正确匹配。
    4. 重启编译器和IDE:有时候重新启动编译器和IDE可以帮助解决一些编译时出现的问题,尝试重新启动看看是否有帮助。
    5. 更新相关依赖:如果是使用ORM框架或者其他依赖库进行查询操作,考虑更新相关依赖库到最新版本,以确保没有已知的问题。 示例代码: @Entity @Table(name = "cinema") public class Cinema { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "cinema_id") private int cinemaId; private String name; private String location; private String brand; @Column(name = "administrative_district") private String administrativeDistrict; private String type; private String rebook; @Column(name = "return_ticket") private String returnTicket; private String price; private String phone; @Column(name = "avatar_id") private String avatarId; // ... } @Repository public interface CinemaRepository extends JpaRepository<Cinema, Integer> { @Modifying @Query("update Cinema c set c.avatarId = :avatarId where c.cinemaId = :id") void updateAvatarIdById(@Param("id") int id, @Param("avatarId") String avatarId); } @SpringBootTest class CinemaRepositoryTest { @Autowired private CinemaRepository cinemaRepository; @Test void testUpdateAvatarIdById() { cinemaRepository.updateAvatarIdById(1, "123isjcmrhs512wk"); // 根据情况进行断言等操作 } }
    评论

报告相同问题?

问题事件

  • 创建了问题 3月21日

悬赏问题

  • ¥15 锌合金的耐温能到多少度。可以持续多长时间
  • ¥15 .net调用本地office组件出现问题
  • ¥15 docker镜像拉取失败请教教我
  • ¥15 https访问nginx上的http
  • ¥15 需要完整规则的五子棋博弈代码
  • ¥15 Hadoop的部署与安装的一些疑问
  • ¥15 短剧的sdk在哪里接入
  • ¥30 智能割草机自动化割草
  • ¥15 求:可不可以提供一些 在国内可以用,低代码不要太难 在电脑上可以下载的 制作app的软件
  • ¥15 fluke高精度万用表8845A型号测交流电压一直跳动,且去掉输入后显示不归零