调用SQL创建的函数时,我的条件查询出现问题

时间:2013-05-16 08:54:24

标签: java hibernate postgresql jpa-2.0 hibernate-4.x

在我的 Postgres 9.1数据库中,我有一个由{em> ORM ( Hibernate )映射的li表,如下{ {1}}课程:     包a.b;     @实体     @Table(name =“li”,schema =“public”)     @TypeDef(name =“inet”,typeClass = InetType.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)
    ...............

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

不确定但是,在您的实体中,该字段的名称为requestTime,但在您的MetaModel中,您将其命名为requestDate。我认为MetaModel可以使用Introspection,所以可能你的错误来自于Hibernate找不到名为requestDate的字段,因为它不存在。

答案 1 :(得分:0)

我的条件查询的真正问题在于我将Li实体放在一个包中,并将其元模型Li_放在另一个包中。我将Li_移到Li的同一个包上,现在看来这个问题已经消失了。