【问题标题】:hibernate parameter with that name [<name>] did not exist具有该名称 [<name>] 的休眠参数不存在
【发布时间】:2017-07-10 10:29:48
【问题描述】:

我正在运行以下代码。

用户服务.java

String alias = "u";
String select = "SELECT u.email";
String where = "u.userId = :id";
Map<String, Object> params = new HashMap<>();
params.put("id", userId);

List<User> users = db.findRecords(User.class, alias, select, where, params);

DB.java

public <T> List<T> findRecords(Class<T> entityClass, String entityAlias, String select, String where, Map<String, Object> params) {
    String sql = select + " FROM " + entityClass.getName() + " " + entityAlias;

    if (where != null) {
        sql = sql + " WHERE " + where;
    }

    Query query = entityManager.createQuery(sql);
    System.out.println(sql);
    if (!params.isEmpty()) {
        Iterator<Entry<String, Object>> iterator = params.entrySet().iterator();
        while (iterator.hasNext()) {
            Entry<String, Object> entry = iterator.next();
            System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue());
            query.setParameter((String) entry.getKey(), (Long) entry.getValue());
        }
    }

    return query.getResultList();
}

我收到以下错误日志。

SELECT u.email FROM com.catalog.user.User u WHERE u.userId = :id
key: id, value: 28636907

Caused by: java.lang.IllegalArgumentException: Parameter with that name [id] did not exist

如果参数在控制台中打印,那么是什么原因导致出现非法参数异常?

请帮忙!

【问题讨论】:

  • 你的类clues.catalog.user.User被声明为实体了吗?
  • 是的。导入 javax.persistence.Column;导入 javax.persistence.Entity;导入 javax.persistence.Table; @Entity @Table(name = "cscart_users") public class User { @Column(name = "user_id") public Long userId;
  • 可能是字符串连接出了点问题,因为他说他在查询中找不到 :id 参数...您可以尝试使用正确的字符串进行创建查询吗? entityManager.createQuery("SELECT u.email FROM questions.catalog.user.User u WHERE u.userId = :id");
  • 拥有完整的堆栈跟踪可能会有所帮助

标签: java hibernate jpa hql entitymanager


【解决方案1】:

1) 检查参数名称:id 中是否存在拼写错误。它区分大小写。

2) 尝试执行不带参数的查询。这可能是实体映射中的问题。

3) 尝试在没有HashMap 的情况下直接在查询中设置参数。

【讨论】:

  • 第 2 点出了什么问题。其他一些实体没有指定标识符。一旦我删除了这些实体,它就开始正常工作了!
【解决方案2】:

我认为这里的问题是由您从Map 获取参数的方式引起的,使用Map.entrySet() 方法迭代的值仅在迭代中可用并且在迭代之外将是未定义的,这就是为什么参数在循环期间正确打印,并且在查询中不存在。

如果你看一下Map.entry documentation,它会说:

这些 Map.Entry 对象仅在 迭代;

我建议你改变存储和使用参数的方式,你可以简单地使用List&lt;Object&gt;来存储参数或者直接在方法调用中传递id参数:

public <T> List<T> findRecords(Class<T> entityClass, String entityAlias, String select, String where, Long id){

然后直接在查询中追加这个值:

query.setParameter("id", id);

【讨论】:

  • 我尝试将键和值存储在变量中,但这也不起作用。而且我不能在函数中添加 id 参数,因为它是所有类型查询的通用函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 2015-06-11
  • 2014-06-24
  • 1970-01-01
相关资源
最近更新 更多