本着与CriteriaQuery相关的类型安全的精神,JPA 2.0还有一个API来支持实体的Metamodel表示.
是否有人知道这个API的全功能实现(生成Metamodel而不是手动创建元模型类)?如果有人也知道在Eclipse中设置它的步骤,那将是非常棒的(我假设它就像设置注释处理器一样简单,但你永远不知道).
编辑:偶然发现了Hibernate JPA 2 Metamodel Generator.但问题仍然存在,因为我找不到jar的任何下载链接.
编辑2:少顷已经过去了,因为我问过这个问题,但我想我会回来,并添加一个链接到SourceForge上的Hibernate JPA模型生成项目
在Sun Online资源中,他们提供了关于Criteria/Metamodel API使用的儿子示例,但据我了解Java,似乎无法工作:
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Metamodel m = em.getMetamodel();
EntityType<Pet> Pet_ = m.entity(Pet.class);
EntityType<Owner> Owner_ = m.entity(Owner.class);
Root<Pet> pet = cq.from(Pet.class);
Join<Owner, Address> address = cq.join(**Pet_.owners**).join(**Owner_.addresses**);
Run Code Online (Sandbox Code Playgroud)
Pet_是一个类的实例, EntityType它没有定义任何名为owners或的属性addresses.
他们确实定义了名为Pet_和Owner_元模型的类,但是在这里输入它们会产生与变量名称的冲突......我是对的吗?
__
(这个问题也与此相关的一个)
我有一个Entity Transaction如下:
@Entity
class Transaction extends AbstractEntity<Long>{
private static final long serialVersionUID = 7222139865127600245L;
//other attributes
@ElementCollection(fetch = FetchType.EAGER, targetClass = java.lang.String.class)
@CollectionTable(name = "transaction_properties", joinColumns = @JoinColumn(name = "p_id"))
@MapKeyColumn(name = "propertyKey")
@Column(name = "propertyValue")
private Map<String, String> properties;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
所以,我的数据库Table为transaction_properties是
mysql> desc transaction_properties;
+---------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| p_id | bigint(20) | NO | PRI | | | …Run Code Online (Sandbox Code Playgroud) 我的理解是 Hibernate Criteria API 已被弃用:
从 Hibernate 5.2 开始,应使用 JPA Criteria API
但在 Hibernate Criteria API 中,构建复杂的查询JOINs很容易。我可以这样做:
Criteria criteriaQuery = session.createCriteria(Request.class);
// 1. Prepare aliases (JOINs) from main table
if (!StringUtils.isBlank(searchCriteria.getRequestorName())) {
criteriaQuery.createAlias("requestor", "npRequestor", JoinType.INNER_JOIN);
}
if (!StringUtils.isBlank(searchCriteria.getApproverName())) {
criteriaQuery.createAlias("workflows", "wf", JoinType.INNER_JOIN);
criteriaQuery.createAlias("wf.approver", "npApprover", JoinType.INNER_JOIN);
}
// Prepare criteria
// ...
criteriaQuery.add(Restrictions.eq("wf.someAttribute", someAttr));
}
Run Code Online (Sandbox Code Playgroud)
但是在JPAJOINs Criteria API 中进行复杂的查询是极其困难的。正如该线程中的一位用户指出的那样,“我很难使用 Criteria API 创建复杂的联接,并且找不到大量的文档和示例。 ”
简单的 Join 需要创建 a Metamodel(一个单独的进程),然后创建一个EntityType,并且语法很难构造。下面只是最简单的示例,但我有多个 If/Else 条件和多路联接。
CriteriaQuery<Pet> …Run Code Online (Sandbox Code Playgroud)