如何在条件查询中使用MAP的键?

发布于 2024-10-17 07:24:27 字数 268 浏览 8 评论 0原文

我有一个像这样的 Bean,

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

Class TestB
{
    String data;
    ...
}

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

我怎样才能使用 Hibernate 来做到这一点?

I have a Bean like this

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

Class TestB
{
    String data;
    ...
}

I want to fetch the TestA data along with the map testBMap where key ='test1'.

How can i do this using Hibernate.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

梦里°也失望 2024-10-24 07:24:27

键必须是 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();

The key must be the value of one of the persistent fields of TestB (let's says this field is names "foo"), so this code should work :

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();
旧竹 2024-10-24 07:24:27

就我而言,这确实工作得很好:

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

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

In my case this did work fine:

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

The mapping is like this:
Country has property name which is of type LocalizedText (an entity)
LocalizedText contains Map<String, String> translations where key is language code and value is country name that corresponds to that language.
So i had to create alias for translations and then user "magic" postfix ".indices" in eq().

蒗幽 2024-10-24 07:24:27

直到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();

Until Hibernate implements JPA's key() function (see HHH-5396), you can use the index() function:

session
    .createQuery("select a from TestA a join a.testBMap m where index(m) = :key")
    .setParameter("key", "test1")
    .list();
迷乱花海 2024-10-24 07:24:27

这对我有用:

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

This works for me:

Criteria criteria = session.createCriteria(TestA.class);
criteria.createAlias("testBMap", "t");
criteria.add(Restrictions.eq("t." + CollectionPropertyNames.COLLECTION_INDEX, "test1"));
return criteria.list();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文