gpt4 book ai didi

java - HQL 查询在运行 SQL 查询时抛出 QueryException

转载 作者:行者123 更新时间:2023-12-02 11:18:08 24 4
gpt4 key购买 nike

我正在使用 HSQLDB 和 Hibernate,并且我想从 REST API 执行搜索请求。

例如,对于像 localhost:8080/search?token=a%20e 这样的 REST 请求,我的方法应该创建以下查询:FROM Course WHERE Course.description LIKE '%a%' OR Course.description LIKE '%e%'我得到了这个异常:

javax.servlet.ServletException: java.lang.IllegalArgumentException: org.hibernate.QueryException: Unable to resolve path [Course.description], unexpected token [Course] [FROM model.Course WHERE Course.description LIKE '%a%' OR Course.description LIKE '%e%']

这是 SearchService 中的代码的搜索方法Course通过descriptionname .

public List<Course> searchCourses(String token, MatchIn column) {

// Prepare and clean token, leaving only key words

String[] keyWords = token.split(" ");

// Build query and ask database to retrieve relevant courses

StringBuilder sb = new StringBuilder("FROM Course WHERE ");
String colName = "Course.";
if(column.equals(MatchIn.DESCRIPTION)) colName += "description";
else if(column.equals(MatchIn.NAME)) colName += "name";
sb.append(colName);

int i = 0;

sb.append(" LIKE \'");
sb.append("%");
sb.append(keyWords[i]);
sb.append("%\'");

if(keyWords.length != 1){
i++;

for (; i < keyWords.length; i++) {
sb.append(" OR " + colName +
" LIKE \'");
sb.append("%");
sb.append(keyWords[i]);
sb.append("%\'");
}
}

Query query = session.createQuery(sb.toString());

return query.list();
}

请注意,在我收到的异常中,它表示我的方法实际上正在创建以下查询:FROM *model.*Course WHERE Course.description LIKE '%a%' OR Course.description LIKE '%e%'

当我尝试SELECT * FROM Course WHERE c.description LIKE '%a%' OR c.DESCRIPTION LIKE '%e%';时在IDEA的SQL控制台中,运行成功。 (我在创建的查询中没有使用 SELECT *,因为 HQL 不使用它)

我是 HQL 和 SQL 新手,所以我不知道问题出在哪里。

编辑:

在调试器模式下,我找到了调用异常的确切位置。 Hibernate 似乎有问题:

The call of Session.createQuery(String queryString)

我不知道是什么导致了这个问题。

最佳答案

HQL 使用绑定(bind)参数,因此直接添加LIKE '%key%' 不起作用。 Hibernate 会将 HQL 转换为 SQL,因此您可以这样做:

for (; i < keyWords.length; i++) {
sb.append(" OR " + colName + " LIKE " + "key" + String.valueOf(i));// notice that I'm not adding the '%%'
}

然后你必须绑定(bind)参数:

 Query query = session.createQuery(sb.toString());

for (int j = 0; j < keyWords.length; j++) {
query.setParameter("key" + String.valueOf(j), "%" + keyWords[j] + "%")
}

正如您所看到的,对于一个简单的查询来说,有很多代码。

所以基本上你有两个选择:

  1. 创建 native SQL。 session.createSQLQuery(...)

  2. 使用标准。

    String colName = "";

    if(column.equals(MatchIn.DESCRIPTION)) {
    colName = "description";
    } else if(column.equals(MatchIn.NAME)) {
    colName = "name";
    }

    Criteria criteria = session.createCriteria(Course.class)

    for(String key : keyWords) {
    criteria.add(Restrictions.or(Restrictions.like( colName, "%" + key + "%"));
    }

    return criteria.list();

提示:

不要连接你的参数。使用query.setParameter(..)

关于java - HQL 查询在运行 SQL 查询时抛出 QueryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50121707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com