我想将JPA2 Criteria API与元模型对象一起使用,这看起来很简单:
...
Root<JPAAlbum> albm = cq.from(JPAAlbum.class);
... albm.get(JPAAlbum_.theme) ... ;
Run Code Online (Sandbox Code Playgroud)
但是这个Root.get总是抛出一个NullPointerException.JPAAlbum_.theme是由Hibernate自动生成的,看起来像
public static volatile SingularAttribute<JPAAlbum, JPATheme> theme;
Run Code Online (Sandbox Code Playgroud)
但它显然从未填充过.
我错过了框架初始化的一个步骤吗?
编辑:这是我在崩溃时如何使用JPA和元模型的片段:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<JPAAlbum> cq = cb.createQuery(JPAAlbum.class) ;
Root<JPAAlbum> albm = cq.from(JPAAlbum.class);
cq.where(cb.equal(albm.get(JPAAlbum_.theme).get(JPATheme_.id),
session.getTheme().getId())) ;
Run Code Online (Sandbox Code Playgroud)
(JPAAlbum_是一个类,所以我就import在之前)和相关的堆栈跟踪:
Caused by: java.lang.NullPointerException
at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:138)
at net.wazari.dao.jpa.WebAlbumsDAOBean.getRestrictionToAlbumsAllowed(WebAlbumsDAOBean.java:55)
Run Code Online (Sandbox Code Playgroud)
编辑2:
在JBoss EntityManager指南中,我可以看到
当构建Hibernate EntityManagerFactory时,它将查找每个托管类型的规范元模型类,如果它找到任何它将向它们注入适当的元模型信息,如[JPA 2规范,第6.2节中所述] .2,页码200]
我也可以验证
for (ManagedType o : em.getMetamodel().getManagedTypes()) {
log.warn("___") ;
for (Object p : o.getAttributes()) {
log.warn(((Attribute)p).getName()) ;
} …Run Code Online (Sandbox Code Playgroud) 我有一些 JPA 类并通过org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor. 所以,我的一门课是:
@Table(name = "USER")
@Entity
@NamedQueries({@NamedQuery(name = "User.byLogin", query = "select u from User u where u.login = :login and u.active = :active")})
public class User implements Serializable {
@Column(name = "ID")
@Id
private Long id;
@Column(name = "LOGIN")
private String login;
@Column(name = "ACTIVE")
private Boolean active;
// etc..
}
Run Code Online (Sandbox Code Playgroud)
元模型处理器生成以下内容:
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(User.class)
public abstract class User_ {
public static volatile SingularAttribute<User, Long> id;
public static volatile SingularAttribute<User, Boolean> active;
public static …Run Code Online (Sandbox Code Playgroud) 我有以下代码片段用于构建条件生成器的条件。
想知道是否有任何方法可以使其更好,因为我将有更多的条件和相同的条件将用于获取记录计数。
任何见解都是非常值得赞赏的
private List <Product> getProducts(MultivaluedMap params) throws JSONException {
CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery <Product> criteriaQuery = criteriaBuilder.createQuery(Product.class);
Root <Product> root = criteriaQuery.from(Product.class);
List <Predicate> p = new ArrayList <Predicate> ();
Predicate prodIdPredicate, prodNamePredicate;
JSONObject inputJSON = new JSONObject(params);
if (inputJSON.isNull("filter") == false) {
JSONObject filter = inputJSON.getJSONObject("filter");
JSONArray filters = filter.getJSONArray("filters");
for (int i = 0; i < filters.length(); i++) {
JSONObject j = (JSONObject) filters.get(i);
if (j.getString("field").equals("prodId")) {
prodIdPredicate = criteriaBuilder.like(root.get(Product_.prodId), j.getString("value"));
p.add(prodIdPredicate);
}
if (j.getString("field").equals("prodName")) …Run Code Online (Sandbox Code Playgroud)