Man*_*anu 3 filtering hibernate hashmap h2 jpa-2.0
我正在使用hibernate-entitymanager 3.6.4.Final和h2数据库1.3.155
我正在使用H2Dialect.
我在使用@ElementCollection中的元素过滤记录时遇到问题.这是我的实体
@Entity
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@MapKeyColumn(name="name", length=50)
@Column(name="value", length=100)
protected Map<String, String> attributes;
/* etc. */
}
Run Code Online (Sandbox Code Playgroud)
这是我的查询:
Item item = em.createQuery("FROM Item i JOIN i.attributes a WHERE KEY(a)='myAttrName'").getSingleResult();
Run Code Online (Sandbox Code Playgroud)
这是错误消息:
4971 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 90022, SQLState: 90022
4971 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Function "KEY" not found; SQL statement:
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute query
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为函数KEY()和VALUE()在这里的doc中可用
我错过了一些配置吗?任何的想法 ?
提前致谢
我有完全一样的问题.经过几个小时的处理,以及调试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;
Run Code Online (Sandbox Code Playgroud)
我可以验证这与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());
Run Code Online (Sandbox Code Playgroud)
我想,如果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());
Run Code Online (Sandbox Code Playgroud)
在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'
)
Run Code Online (Sandbox Code Playgroud)
这显然是畸形的.
再次,在EclipseLink和OpenJPA中这是有效的.
所以,显然,Hibernate必定存在问题.我在Hibernate Jira Issue Tracker中提交了一个错误
https://hibernate.atlassian.net/browse/HHH-6103
并在Hibernate用户论坛中发布了这个问题
https://forum.hibernate.org/viewtopic.php?f=1&t=1010411
最后,我必须使用包含与地图相同条目的可嵌入对象集合来解决问题.为了满足相同的行为,我被迫在embeddable中实现equals和hasHCode.
| 归档时间: |
|
| 查看次数: |
8129 次 |
| 最近记录: |