我在使用参数化 SQL 查询的以下方法的第一个参数上遇到了问题:

lista = miDao.find("SELECT c FROM Idioma WHERE c.palabra =:param", o1 , entityManager);

在哪里:
String o1= "playa";
List<Object> lista;

表“Idioma”有 3 列“palabra”、“idioma”和“wordId”。该方法应在“palabra”列中查找单词“playa”并调用以下 Dao 方法:
@SuppressWarnings("unchecked")
public <T> List<T> find(String queryString, Object param, EntityManager em) {
    Query query = em.createQuery(queryString);
    query.setParameter( "param" , param);
    return query.getResultList();
}

当我运行程序时,我“回滚”了:
Unable to resolve path [c.palabra], unexpected token [c] [SELECT c FROM com.aprendeidiomas.entity.Idioma WHERE c.palabra =:param]

我确定我的参数化 sql 查询有问题。即使我有很多红色文件,我也无法解决我的错误。你能告诉我我的参数化查询有什么问题吗?

非常感谢您提前。

最佳答案

首先,您使用的不是 SQL,而是 JPQL(或 HQL 作为扩展)。

接下来,错误消息已经告诉您出了什么问题:c 未知,因此无法解析 c.palabra。我假设您的意思是选择与 param 中的单词匹配的所有习语,并且您的 Idioma 实体如下所示:

//Annotations and methods omitted for simplicity
class Idioma {
   String palabra;
}

因此,您的查询应说明 cIdioma 的别名,即
SELECT c FROM Idioma c WHERE c.palabra =:param

一个简短的分解:
  • SELECT c - 选择 c
  • 的含义
  • FROM Idioma c - 选择 Idioma 实体并给它们别名 c 以便查询知道返回匹配
  • 的实体
  • WHERE c.palabra = :param - 此条件意味着所有具有作为 param 传递的值(在您的示例中是 o1 的值)的实体与其 palabra 属性匹配。

  • 澄清一下:在 query.setParameter( "param" , param); 之后,内部查询可能如下所示:
    SELECT c FROM Idioma c WHERE c.palabra = "playa"
    

    边注:
    如果要改为选择单词,请使用 SELECT c.palabra ...

    10-05 21:20