2014-04-16 16 views
6

Grails daje możliwość utworzenia prostej właściwości właściwości mapy/łańcucha znaków o wartości "Maps of Objects", first paragraph.Grails: zapytanie lub kryteria względem właściwości pary łańcuchów/wartości par wartości

Zastanawiam się, czy istnieje sposób na późniejsze odpytywanie klasy domeny (przy użyciu wyszukiwaczy dynamicznych Gorm, kryteriów lub HQL) przy użyciu właściwości map jako części zapytania (np. Dodanie warunku dla klucza X, aby mieć wartość Y)?

Odpowiedz

2

Po zabawie z nim i prawie się poddałem, odkryłem składnię mapy do (zaskakująco) pracy w HQL. Zakładając klasy wygląda następująco:

class SomeClass { 
    Map pairKeyProperty 
} 

można tworzyć kwerendy, które wyglądają jak następuje:

select * from SomeClass sc where sc.pairKeyProperty['someKey'] = 'someValue' and sc.pairKeyProperty['someOtherKey'] = 'someOtherValue' 

Całkiem miłe! Nadal wolałbym używać kryteriów, ponieważ są one znacznie czystsze w komponowaniu, ale wydają się nie obsługiwać tej samej składni (lub nie mogłem jej znaleźć).

utworzonego próbki aplikację w GitHub: https://github.com/deigote/grails-simple-map-of-string-value-pairs

Można visisted w: http://grails-map-of-string-pairs.herokuapp.com/

1

powyżej Formę wykorzystuje przekroju przyłączenia. W celu wymuszenia sprzężenia wewnętrznego Użyj

join sc.pairKeyProperty pk1 on index(pk1) = 'someKey' 
where 'someValue' in elements(pk1) 
+0

lepsze w użyciu „członek” zamiast „elementami” przyłączenia PK1 sc.pairKeyProperty na indeks (PK1) „=” someKey gdzie element „SomeValue” z PK1 Czy ktoś wie jak wymusić sprzężenie wewnętrzne i nadal ma operatorów porównania ("jak", "ilike") zamiast tylko testów członkostwa? – jphiloon

+0

Hej jphiloon, dzięki za odpowiedź! Zastanawiam się, czy istnieje jakaś różnica w wydajności między dwoma złączeniami, gdy sprzężenie poprzeczne prawidłowo używa "gdzie" - moje ostatnie zrozumienie jest takie, że nie ma, ale może się mylę. – Deigote