0

In my Postgres 9.1 database I have a li table that is mapped by ORM (Hibernate) in the following Li class: package a.b; @Entity @Table(name = "li", schema = "public") @TypeDef(name="inet", typeClass=InetType.class) public class Li {

    private long id;
    private Date requestTime;
    private String mac;
    private String username;
    private Serializable srcIp;
    private Serializable dstIp;
    private Short length;
    private Short ipProtocol;
    private Integer srcPort;
    private Integer dstPort;

    //..... ... some other related functions (getters, setters, etc)
}

Now, for being able to create a criteria query for Li entity class, I created its metamodel:

package a.metamodel.b;
@StaticMetamodel(Li.class)
public class Li_ {

    public static volatile SingularAttribute<Li, Long> id;
    public static volatile SingularAttribute<Li, Date> requestDate;
    public static volatile SingularAttribute<Li, String> mac;
    public static volatile SingularAttribute<Li, String> username;
    public static volatile SingularAttribute<Li, Serializable> srcIp;
    public static volatile SingularAttribute<Li, Serializable> dstIp;
    public static volatile SingularAttribute<Li, Short> length;
    public static volatile SingularAttribute<Li, Short> ipProtocol;
    public static volatile SingularAttribute<Li, Integer> srcPort;
    public static volatile SingularAttribute<Li, Integer> dstPort;

}

Because I need to search on li table after hour extracted from requestDate field, I created the following postgres function:

create or replace function public.extract_hour(time_param timestamp with time zone) 
    returns double precision language sql as $function$

    SELECT EXTRACT(hour from $1);            
$function$;

Until now everithing tested and works great. So I started to create my criteria:

EntityManager em = ...
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Li> c = cb.createQuery(Li.class);
Root<Li> l = c.from(Li.class);

//pay attention here
Expression<Double> extractHour = cb.function("extract_hour", Double.class, l.get(Li_.requestDate));
c.where(cb.equal(extractHour, Double.parseDouble(aDynamicHourValue)));
TypedQuery<Li> q = em.createQuery(c);
List<Li> lis = q.getResultList();

When I run the code above I get the following error:

java.lang.NullPointerException
    at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:146)
    ...............

of course, that error comes from that line:

Expression<Double> extractHour = cb.function("extract_hour", Double.class, l.get(Li_.requestDate));

Can anybody help me on solving that issue?

1
  • c.from(Li.class); // is returning null Commented May 16, 2013 at 8:58

2 Answers 2

1

Not sure but, in your entity the field is named requestTime but in your MetaModel you named it requestDate. I think that MetaModel works with Introspection so maybe your error comes from that Hibernate cannot locate the field named requestDate as it does not exists.

Sign up to request clarification or add additional context in comments.

Comments

0

The real problem with my criteria query was the fact that I put Li entity in a package, and its metamodel Li_ on another package. I moved Li_ on the same package with Li and now it seems that this issue is gone.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.