InvalidDataAccessApiUsageException:参数值元素与预期类型不匹配

时间:2016-11-05 17:34:55

标签: java spring-boot spring-data spring-data-jpa

我尝试使用Spring Data执行IN查询。我的模型看起来像这样:

@Entity
@Table(name = "customer", schema = "public", catalog = "postgres")
public class CustomerEntity {
    private int id;
    private String name;
    private int balance;
    private String bankId;

    @Id
    @Column(name = "id")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Basic
    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Basic
    @Column(name = "balance")
    public int getBalance() {
        return balance;
    }

    public void setBalance(int balance) {
        this.balance = balance;
    }

    @Basic
    @Column(name = "bank_id")
    public String getBankId() {
        return bankId;
    }

    public void setBankId(String bankId) {
        this.bankId = bankId;
    }

我的存储库界面如下所示:

@Repository
public interface TransactionsRepository extends JpaRepository<TransactionsEntity, Long> {

    List<TransactionsEntity> findByCustomerIdIn(List<CustomerEntity> customerEntities);

}

问题是当我尝试执行此代码时  List<TransactionsEntity> transactionsEntitiesList = transactionsRepository.findByCustomerIdIn(customerEntitiesList);

我得到了这个例外:

Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value element [org.example.domain.admin.CustomerEntity@6a1a2a4] did not match expected type [java.lang.String (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value element [org.example.domain.admin.CustomerEntity@6a1a2a4] did not match expected type [java.lang.String (n/a)]

更新: TransactionsEntity.class

@Entity
@Table(name = "transactions", schema = "public", catalog = "postgres")
public class TransactionsEntity {

    private String id;
    private String amount;
    private String customerId;

    @Id
    @Column(name = "id")
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Basic
    @Column(name = "amount")
    public String getAmount() {
        return amount;
    }

    public void setAmount(String amount) {
        this.amount = amount;
    }

    @Basic
    @Column(name = "customer_id")
    public String getCustomerId() {
        return customerId;
    }

    public void setCustomerId(String customerId) {
        this.customerId = customerId;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        TransactionsEntity that = (TransactionsEntity) o;

        if (id != null ? !id.equals(that.id) : that.id != null) return false;
        if (amount != null ? !amount.equals(that.amount) : that.amount != null) return false;
        if (customerId != null ? !customerId.equals(that.customerId) : that.customerId != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = id != null ? id.hashCode() : 0;
        result = 31 * result + (amount != null ? amount.hashCode() : 0);
        result = 31 * result + (customerId != null ? customerId.hashCode() : 0);
        return result;
    }
}

1 个答案:

答案 0 :(得分:1)

正如Spring中所说的那样,Spring期望String,因为customer_id中的TransactionEntity是一个字符串,但您输入的是CustomerEntity。相反,您应该输入一个List<String>,其中包含您的客户ID列表。

假设您将customer_id设置为int的{​​{1}},那么你应该id成为CustomerEntity吗?

然后你可以做类似

的事情
List<Integer> customerIds = customerEntitiesList.stream().map(CustomerEntity::getId).collect(Collectors.toList());