在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类,它们也有静态元模型.在我的应用程序的服务类中,我使用这些元模型和EntityManager/CriteriaBuilder/CriteriaQuery来检索我的数据.这在运行应用程序时工作正常.但是,在运行单元测试时,我的元模型及其属性始终为null.
码...
package com.example.core.entities;
@Entity
@Table(schema = "lookup", name="BookingSystem")
public class BookingSystem implements ILookupEntity, IAuditEntity, Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id")
public Integer id;
@Column(name = "name")
public String name;
@Column(name = "code")
public Integer code;
}
package com.example.core.entities;
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(BookingSystem.class)
public abstract class BookingSystem_ {
public static volatile SingularAttribute<BookingSystem, Integer> id;
public static volatile SingularAttribute<BookingSystem, Integer> code;
public static volatile SingularAttribute<BookingSystem, String> name;
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序的服务类中使用...
package com.example.bookingsystem;
@Service
public class BookingService {
@PersistenceContext
private …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Hibernate 5.0.7.Final的JPA2类型安全条件查询.
...
criteria.where( builder.equal( root.get(SingularAttribute.attr), value ));
//where parameters are
//criteria.where( builder.equal( root.get(Person_.name), "Can" ));
...
Run Code Online (Sandbox Code Playgroud)
root.get总是抛出NullPointerException.元模型类Person_用于Person通过产生org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor.
在JPA/Hibernate Static Metamodel Attributes not Populated中提出了类似的问题- NullPointerException,但这次两个类都在同一个包中.
堆栈跟踪:
java.lang.NullPointerException
at org.hibernate.jpa.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:123)
Run Code Online (Sandbox Code Playgroud)
我的代码:
我用来确保它们具有的接口getId();.
package it.unibz.db.hibernate.model;
public interface ModelInterface<PK extends Serializable> extends Serializable {
PK getId();
}
Run Code Online (Sandbox Code Playgroud)
模型类
package it.unibz.db.hibernate.model;
@Entity
@Table(name ="person")
public class Person implements ModelInterface<Integer> {
@Id
private Integer id;
private String name;
public Integer getId() …Run Code Online (Sandbox Code Playgroud) 这很好用:
public Predicate toPredicate(Root<Campaign> root,
CriteriaQuery<?> query, CriteriaBuilder cb) {
return root.get("campState").get("statusId").in(campStatus);
}
Run Code Online (Sandbox Code Playgroud)
但我改为:
return root.get(Campaign_.campState).get(CampState_.campId).in(campStatus).
Run Code Online (Sandbox Code Playgroud)
它抛出异常:
编辑:org.hibernate.ejb.criteria.path.AbstractPathImpl.get中的NullPointerException
@StaticMetamodel(Campaign.class)
public class Campaign_ {
public static volatile SingularAttribute<Campaign, CampState> campState;
public static volatile SingularAttribute<Campaign, Long> campId;
}
@StaticMetamodel(CampState.class)
public class CampState_ {
public static volatile SingularAttribute<CampState, String> statusId;
}
Campaign.class
@ManyToOne(cascade = {CascadeType.REFRESH, CascadeType.MERGE})
@JoinColumn(name = "camp_status")
public CampState getCampState() {
return campState;
}
public void setCampState(CampState campState) {
this.campState = campState;
}
Run Code Online (Sandbox Code Playgroud)