如何在Criteria Query中使用MAP键?

时间:2011-02-14 11:32:02

标签: hibernate criteria-api hibernate-criteria

我有像这样的Bean

Class TestA
{
    Map<String,TestB> testBMap;
}

Class TestB
{
    String data;
    ...
}

我想要获取TestA数据以及地图testBMap key ='test1'

如何使用Hibernate执行此操作。

4 个答案:

答案 0 :(得分:4)

密钥必须是TestB的一个持久字段的值(假设这个字段是名称“foo”),所以这段代码应该有效:

Criteria criteria = session.createCriteria(TestA.class, "a");
criteria.createAlias("a.testBMap", "b");
criteria.add(Restrictions.eq("b.foo", "test1"));
criteria.setFetchMode("a.testBMap", FetchMode.JOIN);
return criteria.list();

答案 1 :(得分:3)

就我而言,这确实很好用:

countries = getSession().createCriteria( Country.class ).add( Restrictions.in( "region", regions ) )
                .createAlias( "name.translations", "translation" )
                .add( Restrictions.eq( "translation.indices", 'en' )).list();

映射是这样的: 国家/地区具有属性名称,其类型为LocalizedText(实体) LocalizedText包含Map<String, String>个翻译,其中key是语言代码,value是与该语言对应的国家/地区名称。 所以我必须为翻译创建别名,然后在eq()中使用“magic”postfix“.indices”。

答案 2 :(得分:2)

在Hibernate实现JPA的key()函数(参见HHH-5396)之前,您可以使用index()函数:

session
    .createQuery("select a from TestA a join a.testBMap m where index(m) = :key")
    .setParameter("key", "test1")
    .list();

答案 3 :(得分:1)

这对我有用:

Criteria criteria = session.createCriteria(TestA.class);
criteria.createAlias("testBMap", "t");
criteria.add(Restrictions.eq("t." + CollectionPropertyNames.COLLECTION_INDEX, "test1"));
return criteria.list();