2014-08-28 59 views
1
我有以下方法與參數化的SQL查詢的第一個參數poblem

「org.hibernate.QueryException:無法解析路徑...」錯誤與參數化查詢在JPA

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

其中:

String o1= "playa"; 
List<Object> lista; 

表 「語」 有3列 「言論報」, 「語」 和 「的wordID」。該方法有望尋找列「言論報」內的字「花花公子」調用以下方法道:

@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(); 
} 

當我跑我「rollbacked」搭配方案:

Unable to resolve path [c.palabra], unexpected token [c] [SELECT c FROM com.aprendeidiomas.entity.Idioma WHERE c.palabra =:param] 

我敢肯定,我的參數化sql查詢有問題。儘管我有很多文件,但我無法解決我的錯誤。你能否認爲我的參數化查詢有什麼問題?

非常感謝您提前。

+3

'c'是什麼?你的意思是'SELECT c FROM Idioma c ...'? – Thomas 2014-08-28 10:52:29

+0

「c」是我要替換爲「playa」的參數 – 2014-08-28 10:54:30

+0

不,參數是'param'。 – Thomas 2014-08-28 10:57:38

回答

4

首先,你正在使用的不是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意味着 - 選擇授權許可的實體,並給他們別名c這樣查詢就會知道要返回匹配
  • 的實體
  • WHERE c.palabra = :param - 此條件意味着所有具有值param(在本例中爲o1的值)的實體匹配它們的palabra原型RTY。

作爲一個澄清:query.setParameter("param" , param);查詢後,在內部可能是這樣的:

SELECT c FROM Idioma c WHERE c.palabra = "playa" 


旁註: 如果要選擇的話,而應使用SELECT c.palabra ...

+0

對邊註釋:你的意思是像「SELECT c.palabra FROM Idioma c =:param」? – 2014-08-28 11:24:22

+0

@VictorDoors no'SELECT c.palabra FROM Idioma c WHERE c.palabra =:param' – Thomas 2014-08-28 11:25:50

+0

非常感謝您的回答和您的耐心。一切都很明確:) – 2014-08-28 11:29:42

1

我猜c應該是Idioma的實例嗎? 所以,你必須別名添加到您的statemen:

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

感謝您的回覆,但您的意思是添加別名? 注意:在設置的參數實例之後,「c」應該是「playa」。 – 2014-08-28 10:59:29

+0

三你講述什麼樣的對象是c?請添加您的問題的真相! – Jens 2014-08-28 11:02:12

+0

你是對的!到目前爲止,我不明白你的意思。 「c」是「語言」的一個實例。 – 2014-08-28 11:12:38