首页 > 解决方案 > JPA 查询:java.lang.IllegalArgumentException:提供了至少 1 个参数,但查询中仅存在 0 个参数

问题描述

当我想通过 userId 查询最年轻的(按日期)记录且 userId 不为空时,会引发异常。此方法编写正确还是有错误?

我有以下组件:

存储库

public interface CustomEventStorage extends JpaRepository<CustomEventData, CustomEventDataId> {
    CustomEventData findFirstByUserIdNotNullOrderByIdDateDesc(@Param("userId") String userId);
}

实体

@Entity
@Table(name = "event")
public class CustomEventData {

    @EmbeddedId
    private CustomEventDataId id;

    @Column(name = "state")
    @Enumerated(EnumType.STRING)
    private EventState state;
    @Column(name = "user_id")
    private String userId;

可嵌入 ID

@Embeddable
public class CustomEventDataId implements Serializable {

    @Column(name = "event_id")
    private String eventId;
    @Column(name = "date")
    private LocalDateTime date;

例外

引起:java.lang.IllegalArgumentException:至少提供了 1 个参数,但查询中只存在 0 个参数。在 org.springframework.util.Assert.isTrue(Assert.java:136) ~[spring-core-5.1.7.RELEASE.jar:5.1.7.RELEASE] 在 org.springframework.data.jpa.repository.query。 QueryParameterSetterFactory$CriteriaQueryParameterSetterFactory.create(QueryParameterSetterFactory.java:291) ~[spring-data-jpa-2.1.8.RELEASE.jar:2.1.8.RELEASE] at org.springframework.data.jpa.repository.query.ParameterBinderFactory.lambda $createQueryParameterSetter$1(ParameterBinderFactory.java:139) ~[spring-data-jpa-2.1.8.RELEASE.jar:2.1.8.RELEASE] at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193 ) ~[na:1.8.0_242] at java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958) ~[na:1.8.

标签: javahibernatejpaspring-data-jpa

解决方案


JPA 在查询中没有期望userId,因为您在查询中使用UserIdNotNull了 which 的意思user_id IS NOT NULLwhich don't expect userId。使用这种方式userId

CustomEventData findFirstByUserIdOrderByIdDateDesc(@Param("userId") String userId);

您不需要检查 not null 因为您正在传递 userId。


推荐阅读