2011-04-12 20 views
1

我有一個域類Schedule與屬性'天'持逗號分隔值如'2,5,6,8,9'。搜索記錄包含逗號分隔的值,包含給定列表中的任何元素

Class Schedule { 
    String days 
    ... 
} 

Schedule schedule1 = new Schedule(days :'2,5,6,8,9') 
schedule1.save() 

Schedule schedule2 = new Schedule(days :'1,5,9,13') 
schedule2.save() 

我需要從給定列表中獲取任意一天的時間表列表[2,8,11]。

Output: [schedule1]

我怎樣寫的條件查詢或HQL的一樣。如果有幫助的話,我們可以用',2,5,6,8,9'等逗號前綴&後綴。

感謝,

回答

2

希望你有一個很好的理由對這種非規範化 - 否則這將是更好的列表保存到一個子表。

否則,查詢將變得複雜。像:

def days = [2,8,11] 
    // note to check for empty days 
    Schedule.withCriteria { 
    days.each { day -> 
     or { 
     like('username', "$day,%") // starts with "$day" 
     like('username', "%,$day,%") 
     like('username', "%,$day") // ends with "$day" 
     } 
    } 
    } 
+0

謝謝維克多!我通過將時間表格式更改爲「,2,5,6,8,9」來簡化它,然後僅使用一個類似的語句,例如('days',「%,$ day,%」) – 2011-04-14 05:38:33

0

在MySQL中有一個SET數據類型和FIND_IN_SET函數,但我從來沒有用過Grails。有些數據庫支持標準SQL2003 ARRAY數據類型,用於在一個字段中存儲數組。可以使用hibernate usertypes(Grails支持)映射它們。

如果你正在使用MySQL,FIND_IN_SET查詢應與標準API sqlRestriction工作: http://grails.org/doc/latest/api/grails/orm/HibernateCriteriaBuilder.html#sqlRestriction(java.lang.String) 使用SET + FIND_IN_SET使查詢比之類的查詢效率更好,如果你關心性能,並有實際需求做非規範化。

+0

或Oracle表集羣:http://www.frontiernet.net/~rhode/cluster.html。或者是什麼。如果我們真的關心效率,我們可以爲任何具有位字段或字符串模擬位字段的DBMS實施Set。 – 2011-04-12 12:52:22

+0

非常感謝Flare!這看起來不錯,我會嘗試一下 – 2011-04-14 05:42:06

相關問題