Проблемы с моим запросом критериев при вызове созданной функции SQL

В моей базе данных Postgres 9.1 есть таблица li, которая отображается с помощью ORM (Hibernate) в следующем классе Li: 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)
}

Теперь, чтобы иметь возможность создать запрос критериев для класса сущностей Li, я создал его метамодель:

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;

}

Поскольку мне нужно искать в таблице li через час, извлеченный из поля requestDate, я создал следующую функцию postgres:

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$;

Пока все проверено и отлично работает. Итак, я начал создавать свои критерии:

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();

Когда я запускаю код выше, я получаю следующую ошибку:

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

конечно, эта ошибка исходит из этой строки:

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

Может ли кто-нибудь помочь мне в решении этой проблемы?


person artaxerxe    schedule 16.05.2013    source источник
comment
c.от(Li.класс); // возвращает ноль   -  person Xavier DSouza    schedule 16.05.2013


Ответы (2)


Не уверен, но в вашем объекте поле называется requestTime, но в вашей метамодели вы назвали его requestDate. Я думаю, что MetaModel работает с Introspection, поэтому, возможно, ваша ошибка связана с тем, что Hibernate не может найти поле с именем requestDate, поскольку оно не существует.

person gma    schedule 16.05.2013

Настоящая проблема с моим запросом критериев заключалась в том, что я поместил сущность Li в пакет, а ее метамодель Li_ — в другой пакет. Я переместил Li_ в тот же пакет, что и Li, и теперь кажется, что эта проблема исчезла.

person artaxerxe    schedule 17.05.2013