2011-10-25 16 views
1

我試圖找出如何使這個剪斷代碼工作的JOIN HQL查詢在SQL Server中,它返回正確的結果,但我的Grails代碼抱怨:INNER從Grails的

Stacktrace follows: 
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: ON near line 1, column 59 [select e.id from Employee as e INNER JOIN Education as ed ON e.id = ed.employee_id INNER JOIN education_type AS et ON et.id = ed.type_id WHERE et.name in ('AA','BS')] 

那麼我在做什麼錯?它是執行查詢的錯誤域對象嗎?

回答

0

HQL與標準SQL略有不同。假設Hibernate知道即將

List<String> typeNames = unchecked.collect { it.replace("\"", "") } 
String query = """FROM Employee e 
        WHERE e.education.educationType.name IN (:typeNames)""" 
List<Employee> = Employee.executeQuery(query, [typeNames: typeNames]) 

這是爲使用名爲params中,位置PARAMS與您的查詢,以防止SQL注入非常重要的,這些對象可以簡化您的查詢之間的關係。此外,如果你真的只想要一個員工ID列表而不是實例,你可以把SELECT e.id放回去。也沒有理由包含引號,因爲當參數被綁定時,他們將使用正確的引用來處理您正在使用的數據庫,因爲上面的代碼片段也會刪除引號,但是您可能會重新考慮甚至讓它們包含在內第一個地方。

+0

這給了我的一個意外標記:在查詢中。我不認爲你可以在發送到HQL查詢的參數類型中使用一個列表 – Derek

+0

對不起,試着把括號括起來,像'(:typeNames)' –

+0

這個命名參數謝謝。我在Google搜索後發現了這個問題。我想我將不得不對此做一些修補。 educationType是教育類集合中的一個問題 – Derek

2

考慮做這樣的:

def employee = Employee.withCriteria { 
    education { 
     educationType { 
      in("name", ["AA", "BS"]) 
     } 
    } 
}