出现的问题: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");
}