【问题标题】:Jpa Parameter value element [xxx] did not match expected type [xxx]Jpa 参数值元素 [xxx] 与预期类型 [xxx] 不匹配
【发布时间】:2019-03-13 17:51:14
【问题描述】:

我有一个像下面这样的 Jpa 方法。

Set<ApplicationMaterialFile> findAllByProcessInstanceIdAndApplicationMaterialIn(String processInstanceId, Collection<ApplicationMaterial> applicationMaterials);

这是调用上述 Spring Data JPA 方法的代码。这里调用上面的 Spring Data JPA 方法会抛出异常。

@Override
    public Set<ApplicationMaterialFile> getAllByProcessInstanceIdApplicationMaterialIds(String processInstanceId, Set<Long> applicationMaterialId) {
        List<ApplicationMaterial> applicationMaterials = applicationMaterialService.getAllByIdIfNotExistsThenThrowException(applicationMaterialId);

        return applicationMaterialFileRepository.findAllByProcessInstanceIdAndApplicationMaterialIn(processInstanceId, applicationMaterials);
    }

这是 ApplicationMaterial 实体结构。

/**
 * 
 * @see <a href="https://code.aliyun.com/butterfly-effect/backend/wikis/plans"
 * @author himly z1399956473@gamil.com
 */
@Table(name = "application_material_library")
@Entity
@EntityListeners(AuditingEntityListener.class)
@Data
@ToString(exclude = {"university"})
@EqualsAndHashCode(exclude = {"university"})
public class ApplicationMaterial {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    private String fileFormat;


    private String description;


    private String templateFileUrl;


    @JsonIgnore
    @ManyToOne
    private University university;


    @CreatedDate
    @Column(nullable = false)
    private Timestamp createdAt;


    @LastModifiedDate
    @Column(nullable = false)
    private Timestamp updatedAt;
}

何时调用 Spring Data JPA 方法findAllByProcessInstanceIdAndApplicationMaterialIn 会抛出如下异常

原因:java.lang.IllegalArgumentException:参数值元素 [ApplicationMaterial(id=1, name=sdfsf, fileFormat=doc, 描述=dfsdfds,templateFileUrl=fsdfsdf,createdAt=2018-09-26 16:54:09.297, updatedAt=2018-09-26 16:54:23.451)] 不匹配 预期类型 [com.hikedu.backend.model.ApplicationMaterial (n/a)]

有人可以帮帮我吗?

更新:

表结构:

-- auto-generated definition
create table application_material_library
(
  id                bigint auto_increment
    primary key,
  created_at        datetime(6)  not null,
  description       varchar(255) null,
  file_format       varchar(255) null,
  name              varchar(255) not null,
  template_file_url varchar(255) null,
  updated_at        datetime(6)  not null,
  university_id     bigint       null,
  constraint FK9kuemh1kjhyt8u16sqw6i6t59
  foreign key (university_id) references universities (id)
);

【问题讨论】:

  • 您的表中是否使用了私有字符串文件格式?
  • 是的,它在application_material_library 表中使用。并且列类型是varchar。
  • 我不确定您是否对映射有任何问题,因为我们看不到您的表格字段。如果您可以确认所有映射都已正确配置并且保存新实体是否可以?
  • @huy 我删除了表并再次创建了它们。但它没有用。
  • 同样的问题,如果您可以确认所有映射配置正确并且保存新实体是否可以?因为前提是映射正确。如果您确定映射,请尝试在方法上使用@Query 来定义而不是使用方法名称。

标签: java spring hibernate spring-data-jpa


【解决方案1】:

Spring Data 似乎没有找到您的自定义方法实现。

因此,它将方法解释为派生查询方法,并抱怨参数类型与预期不匹配。该错误很奇怪,因为它会抱怨,尽管类型似乎匹配。但这不是你的问题。问题是没有找到自定义方法。

This answer describes how to do a custom implementation depending on which version of Spring Data you are using.

【讨论】:

    猜你喜欢
    • 2014-06-09
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    相关资源
    最近更新 更多