相关疑难解决方法(0)

JPA/Hibernate静态元模型属性未填充 - NullPointerException

我想将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)

java hibernate nullpointerexception criteria-api jpa-2.0

22
推荐指数
3
解决办法
2万
查看次数

JPA 元模型字段为空

我有一些 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)

java hibernate jpa jpamodelgen

5
推荐指数
1
解决办法
1790
查看次数

JPA 标准谓词条件

我有以下代码片段用于构建条件生成器的条件。

想知道是否有任何方法可以使其更好,因为我将有更多的条件和相同的条件将用于获取记录计数。

任何见解都是非常值得赞赏的

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)

java json jpa criteria-api jpa-2.0

1
推荐指数
1
解决办法
1万
查看次数