Java 如何从JPA查询中获得结果,按自定义条件进行筛选

Java 如何从JPA查询中获得结果,按自定义条件进行筛选,java,jpa-2.0,jpql,criteria-api,Java,Jpa 2.0,Jpql,Criteria Api,是否有机会通过复杂的自定义条件(看起来只是java函数)过滤查询结果?我希望这些条件函数在实体创建和将其放入结果集合之间起作用。 例如,我有以下实体和查询 @Entity @NamedQueries{ @NamedQuery(name="myquery",query="...") } class MyEntity{ @Id public long id; @Column(name="NAME") public String name; @Col

是否有机会通过复杂的自定义条件(看起来只是java函数)过滤查询结果?我希望这些条件函数在实体创建和将其放入结果集合之间起作用。 例如,我有以下实体和查询

@Entity
@NamedQueries{
    @NamedQuery(name="myquery",query="...")
}
class MyEntity{
    @Id
    public long id;

    @Column(name="NAME")
    public String name;

    @Column(name="description")
    public String description;
}

我可以执行myquery并指定分页参数以获得固定大小的结果集。但我想做一些额外的复杂过滤,这不能用查询来表示。如果我做一些查询后处理函数,并使用它来过滤查询结果,我会打破页面大小的分页不变量。这样做既不好也不方便

没有简单的方法可以做到这一点。setFirstResult和setMaxResults方法应用于生成的SQL查询。例如,在MySQL中,LIMIT 10,10被添加到查询的where子句中。因此,如果在执行查询后过滤结果,您将始终获得较少的结果。

namedquerys是实现这一点的错误方法

您需要动态构建查询

EntityManager em=....
Query queryObject = em.createQuery(queryString);

Query queryObject = em.createNativeQuery(queryString);

是否有任何困难但有效且合理的方法?使用存储过程?使用JDBC,滚动结果集,并在每一行上应用过滤器,直到获得页面大小?如果使用Hibernate,请使用本机API滚动查询结果?