【问题标题】:Issues with my criteria query when calling SQL created function调用 SQL 创建函数时我的条件查询出现问题
【发布时间】:2013-05-11 02:02:34
【问题描述】:

在我的 Postgres 9.1 数据库中,我有一个 li 表,该表由 ORM (Hibernate) 在以下 Li 中映射班级: 包 a.b; @实体 @Table(name = "li", schema = "public") @TypeDef(name="inet", typeClass=InetType.class) 公开课李{

    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;

}

因为我需要在从requestDate 字段中提取的小时后搜索li 表,所以我创建了以下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));

谁能帮我解决这个问题?

【问题讨论】:

  • c.from(Li.class); // 正在返回 null

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


【解决方案1】:

不确定,但在您的实体中,该字段名为 requestTime,但在您的 MetaModel 中,您将其命名为 requestDate。我认为 MetaModel 可与 Introspection 一起使用,因此您的错误可能来自 Hibernate 无法找到名为 requestDate 的字段,因为它不存在。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 2020-03-10
      • 2020-04-25
      • 2017-09-12
      相关资源
      最近更新 更多