我在使用参数化 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;
}
因此,您的查询应说明
c
是 Idioma
的别名,即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 ...
。