gpt4 book ai didi

jpa - JPA条件构建器联接图

转载 作者:行者123 更新时间:2023-12-04 17:12:52 24 4
gpt4 key购买 nike

我有以下条件构建器查询

    CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Object> critQuery = cb.createQuery();

Root<Role> role = critQuery.from(Role.class);

//create a join between role and permission
MapJoin<Role,String,Permission> perm = role.joinMap("permissions");
critQuery.multiselect(role.get("label"), perm.key(), perm.value());

//this line throws NPE
Query query = em.createQuery(critQuery);

最后一行抛出空指针异常。
java.lang.NullPointerException
at org.hibernate.ejb.criteria.path.AbstractPathImpl.prepareAlias(AbstractPathImpl.java:246)
at org.hibernate.ejb.criteria.path.AbstractPathImpl.render(AbstractPathImpl.java:253)
at org.hibernate.ejb.criteria.path.AbstractPathImpl.renderProjection(AbstractPathImpl.java:261)

最佳答案

我也有完全一样的问题。经过数小时的处理,调试了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());

在休眠状态下,它将生成以下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问题跟踪器中提交了一个错误

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

并已在Hibernate Users Forum中发布了问题

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

关于jpa - JPA条件构建器联接图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5580614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com