错误:参数值与预期类型不匹配

CSL*_*ner 3 jpa jpql

我试图使用WHERE子句中的ID从我的数据库中检索USER.但是我收到一个错误,我的程序失败了.

这是我运行程序时收到的错误:

ERROR [org.jboss.as.ejb3.invocation] (default task-19) 
JBAS014134: EJB Invocation failed on component CustomerServiceBeanImpl 
for method public abstract package.name.entity.ICustomer 
package.name.bean.CustomerServiceBean.getCustomerById(long): 
javax.ejb.EJBException: java.lang.IllegalArgumentException: 
Parameter value [19533] did not match expected type [package.name.entity.User (n/a)]
Run Code Online (Sandbox Code Playgroud)

注意:[19533]是我使用的测试值.

这是CustomerServiceBeanImpl.java中出现错误的方法:

@Override
public Customer getCustomerById (final long id)
{
    return Customer.getById (this.em, id);
}
Run Code Online (Sandbox Code Playgroud)

这是组件CustomerServiceBeanImpl调用的方法:

public static Customer getById (final EntityManager em, final long id)
{
    for (final Customer c : em.createNamedQuery ("Customer.getById", Customer.class)
    .setParameter ("id", id).setMaxResults (1).getResultList ())
    {
        return c;
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

名称查询是这样的:

@NamedQuery (name = "Customer.getById", 
query = "SELECT o FROM gnf.Customer o WHERE o.user = :id")
Run Code Online (Sandbox Code Playgroud)

在Customer.java类本身中,相关列是这样的:

@ManyToOne (fetch = FetchType.LAZY)
@JoinColumn (name = "user_id")
private User         user;
Run Code Online (Sandbox Code Playgroud)

快速检查我的ERD我的"customer"表中的"id"列的数据类型为BIGINT.但是我不确定这是否重要.(顺便说一下PostgreSQL数据库.)

我该如何解决这个错误?

小智 8

您的命名查询中的WHERE子句似乎是个问题.Customer.class中的属性用户是User类型,您的查询期望它是与long兼容的类型.

...参数值[19533]与预期类型[package.name.entity.User ...不匹配

因此,如果您需要更多帮助,那么很高兴看到完整的实体用户和客户.

  • 通常,查询链接到 Java 类的类名(区分大小写)和属性名,而不是表名和表列名。当有一个包含由`@OneToOne` 关系或类似的东西引起的外键的表时,查询中的参数需要设置为**对象**,**不是**其id。 (2认同)