Ich habe eine Hibernate Mapping, die wie folgt aussieht:Wie Abfrage für Kartenelement im Ruhezustand?
<hibernate-mapping>
<class name="MutableEvent" table="events"
mutable="true" dynamic-insert="true" dynamic-update="true">
<id name="id">
<generator class="assigned" />
</id>
<property name="sourceTimestamp" />
<property name="entryTimestamp" />
<map name="attributes" table="event_attribs"
access="field" cascade="all">
<key column="id" />
<map-key type="string" column="key" />
<element type="VariantHibernateType">
<column name="value_type" not-null="false" />
<column name="value_string" not-null="false" />
<column name="value_integer" not-null="false" />
<column name="value_double" not-null="false" />
</element>
</map>
</class>
</hibernate-mapping>
Speichern und Laden von meinem Objekt funktioniert. Die Frage, die ich habe, ist die Suche nach Karten im Winterschlaf unterstützt, und wie würde ich es mit den Kriterien api tun?
ich so etwas wie dies tun will (das ist eigentlich ein Teil meines Testfalls ist):
...
m.getAttributes().put("other", new Variant("aValue"));
this.storeEvent(MutableEvent.fromEvent(e));
getSession().clear();
MutableEvent m = (MutableEvent) getSession().get(MutableEvent.class, e.getId());
Assert.assertNotNull(m.getAttributes().get("other"));
Assert.assertEquals(new Variant("aValue"), m.getAttributes().get("other"));
Assert.assertNull(m.getAttributes().get("other2"));
getSession().clear();
crit = DetachedCriteria.forClass(MutableEvent.class);
crit.add(Restrictions.eq("attributes.other", new Variant("aValue")));
List l = this.findByCriteria(crit);
Assert.assertEquals(1, l.size());
Der wichtigste Teil ist, scheitert dies mit „Kann nicht auflösen Eigenschaft: attributes.other“:
crit.add(Restrictions.eq("attributes.other", new Variant("aValue")));
List l = this.findByCriteria(crit);
Gibt es überhaupt eine Lösung für dieses Problem?
aktualisieren
List l = find("from MutableEvent M where M.attributes['other'] = ?", new Variant("aValue"));
Der obige Code nicht eine Ausnahme wirft, aber die Abfrage selbst ist noch nicht das, was ich haben will. Ich habe einen benutzerdefinierten Typ erstellt, wie man durch das Mapping sehen kann, eigentlich würde ich nach einem String (Spalte value_string) suchen, aber jeden Versuch, die Abfrage zu modifizieren, um auf einen Teil des Typs wie in "von MutableEvent M zuzugreifen, wo M. Attribute ['andere']. string =? " funktioniert nicht. Wie würde ich nach einem Teil einer Komponente fragen?
Der Typ wird wie folgt umgesetzt:
...
private static final String[] PROPERTY_NAMES = { "type", "string", "integer", "double" };
public String[] getPropertyNames() {
return PROPERTY_NAMES;
}
...
Kriterien api ist nicht so mächtig wie HQL, Sie können für Karte in HQL abfragen. – IAdapter