栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

HIBERNATE-JPA2-H2-通过键查询@ElementCollections HashMap

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

HIBERNATE-JPA2-H2-通过键查询@ElementCollections HashMap

我有完全一样的问题。经过数小时的处理,调试了Hibernate源代码,并反复检查了书本和JPA
2.0规范中的示例之后,我决定尝试在Eclipselink中进行尝试。

因此,我创建了一个非常简单的示例:一个拥有电话号码映射的员工,其中的关键是电话的类型(家庭,办公室,移动电话),值是电话号码。

@ElementCollection(fetch=FetchType.EAGER)@CollectionTable(name="emp_phone")@MapKeyColumn(name="phone_type")@Column(name="phone_num")private Map<String, String> phoneNumbers;

我可以验证它是否可以与Eclipselink 2.1和OpenJPA 2.1.0完美配合,但是在Hibernate
3.5.3、3.6.1。,3.6.3中失败。

CriteriaBuilder builder = entityManager.getCriteriaBuilder();CriteriaQuery<Employee> criteria = builder.createQuery(Employee.class);Root<Employee> employeeRoot = criteria.from(Employee.class);criteria.select(employeeRoot);MapJoin<Employee, String, String> phoneRoot = employeeRoot.joinMap("phoneNumbers");criteria.where(builder.equal(phoneRoot.key(), "HOME"));System.out.println(entityManager.createQuery(criteria).getResultList());

我认为,如果Criteria
API失败了,也许我可以使用命名查询来做到这一点。有趣的是,Hibernate不支持KEY,VALUE或ENTRY关键字,因此查询被证​​明格式错误。

http://opensource.atlassian.com/projects/hibernate/browse/HHH-5396

这是运行:

String query = "SELECT e FROM Employee e JOIN e.phoneNumbers p WHERe KEY(p) IN ('HOME')";System.out.println(entityManager.createQuery(query, Employee.class).getResultList());

在hibernate状态下,它将生成以下SQL查询:

   select        employee0_.id as id0_,        employee0_.name as name0_     from        Employee employee0_     inner join        emp_phone phonenumbe1_  on employee0_.id=phonenumbe1_.Employee_id     where        KEY(phonenumbe1_.phone_num) in ( 'HOME'        )

这显然是畸形的。

同样,在Eclipselink和OpenJPA中也可以。

因此,显然,Hibernate一定有问题。我已经在Hibernate Jira问题跟踪器中提交了一个错误

https://hibernate.atlassian.net/browse/HHH-6103

并在Hibernate用户论坛中发布了问题

https://forum.hibernate.org/viewtopic.php?f=1&t=1010411

最后,我不得不使用包含与地图相同条目的可嵌入对象的集合来解决该问题。为了满足相同的行为,我被迫在可嵌入对象中实现equals和hasHCode。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/412922.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号