java.lang.IllegalArgumentException:您试图使用查询字符串中不存在的字符串名称设置参数值

use*_*913 3 parameters jpa derby named-query

我有以下命名查询:

@NamedQuery(
    name = "Userdetails.findByUsername", 
    query = "SELECT u FROM Userdetails u WHERE u.username = :username"
)
Run Code Online (Sandbox Code Playgroud)

当我尝试按如下方式执行时:

getEntityManager()
    .createNamedQuery("Userdetails.findByUsername")
    .setParameter("string", "%" + string + "%")
    .getResultList();
Run Code Online (Sandbox Code Playgroud)

然后我得到以下异常:

java.lang.IllegalArgumentException:您试图使用查询字符串中不存在的字符串名称设置参数值SELECT u FROM Userdetails u WHERE u.username =:username.

这是怎么造成的,我该如何解决?

Lui*_*oza 7

在您的Userdetails.findByUsername命名查询中,您有一个名为的参数username:

SELECT u FROM Userdetails u WHERE u.username = :username
Run Code Online (Sandbox Code Playgroud)

然后使用实体管理器调用它,但设置string参数:

getEntityManager()
    .createNamedQuery("Userdetails.findByUsername")
    .setParameter("string", "%" + string + "%") //<-- check here
    .getResultList();
Run Code Online (Sandbox Code Playgroud)

将此string参数替换为username:

getEntityManager()
    .createNamedQuery("Userdetails.findByUsername")
    .setParameter("username", "%" + string + "%") //<-- check here
    .getResultList();
Run Code Online (Sandbox Code Playgroud)