У меня есть следующий сохраненный класс:
public class Code {
@ElementCollection(targetClass = CodeValue.class)
@MapKeyClass(CodeProperty.class)
@JoinTable(name="code_properties")
@CreateIfNull( value = false )
private Map<CodeProperty,CodeValue> propertiesMap =
new HashMap<CodeProperty, CodeValue>();
...
}
public class CodeProperty {
private String name;
...
}
public class CodeValue {
private String value;
...
}
И я пытаюсь получить список кода, отфильтрованный некоторыми свойствами, которые у меня есть в propertiesMap (например, коды, где свойство с именем "color" имеет значение "зеленый".
Я использую следующие базовые критерии:
Criteria criteria = currentSession()
.createCriteria(Code.class, "code")
.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
Когда я пытаюсь выполнить фильтр коллекции (как предложено здесь):
criteria.createAlias("code.properties", "p");
criteria.add(Restrictions.eq("p.foo", "test1"));
criteria.setFetchMode("code.properties", FetchMode.JOIN);
criteria.list();
Я получаю следующую ошибку:
org.hibernate.QueryException: could not resolve property: foo of: com.example.CodeValue
Это означает, что я действительно не понимаю, почему, hibernate считает, что code.properties является CodeValue вместо карты!!!
Я также попытался получить доступ к этому полю, не создавая псевдоним, и таким образом hibernate, похоже, обращается к правильному классу Code. Я использовал properties.indeces (как предложено здесь):
criteria.add(Restrictions.eq("properties.indeces", "foo"));
criteria.list();
Но с этим я получаю следующую ошибку:
could not resolve property: properties.indeces of: com.example.Code
Может кто-нибудь помочь мне понять, что случилось? Каким будет правильный запрос критериев, чтобы найти коды с зеленым цветом?
Вы можете проверить проект Github, демонстрирующий эту проблему.
Спасибо