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

Posted

技术标签:

【中文标题】java.lang.IllegalArgumentException:您尝试使用查询字符串中不存在的字符串名称设置参数值【英文标题】:java.lang.IllegalArgumentException: You have attempted to set a parameter value using a name of string that does not exist in the query string 【发布时间】:2013-11-19 19:57:45 【问题描述】:

我有以下命名查询:

@NamedQuery(
    name = "Userdetails.findByUsername", 
    query = "SELECT u FROM Userdetails u WHERE u.username = :username"
)

当我尝试如下执行时:

getEntityManager()
    .createNamedQuery("Userdetails.findByUsername")
    .setParameter("string", "%" + string + "%")
    .getResultList();

然后我得到以下异常:

SELECT u FROM Userdetails u WHERE u.username = :username.

这是怎么引起的,我该如何解决?

【问题讨论】:

那个错误信息似乎很清楚。我对您正在寻求什么帮助感到困惑。如果您有代码问题,您需要发布一些代码。 读取错误。您的查询中可能有一个占位符 :foo,但正在尝试为 :baz 或类似的东西绑定一个值。 对不起,这是我的第一个这样的项目并使用这些技术,是什么导致了这个错误,数据库中的字段只有 i.d。和用户名,用户名是我试图返回的,我只是不明白我该如何解决这个问题 问题出在您上一个问题的 JPA 代码中:***.com/q/20080195/1065197。您将:username 作为命名参数,但在return getEntityManager().createNamedQuery("Userdetails.findByUsername").setParameter("string", "%" + string + "%").getResultList(); 中设置string 非常感谢,我认为它现在正在工作,我只需要显示结果,但我想我现在需要一些睡眠!谢谢大家 【参考方案1】:

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

SELECT u FROM Userdetails u WHERE u.username = :username

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

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

username替换这个string参数:

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

【讨论】:

以上是关于java.lang.IllegalArgumentException:您尝试使用查询字符串中不存在的字符串名称设置参数值的主要内容,如果未能解决你的问题,请参考以下文章

IllegalArgumentException:此 NavController 未知导航目的地 xxx