如何使用JPA Criteria Query重写此查询? [英] How to rewrite this query using JPA Criteria Query?
本文介绍了如何使用JPA Criteria Query重写此查询?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
public class Entity {
private boolean suspended;
private String code;
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@DateTimeFormat(style = "S-")
private DateTime validFrom;
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@DateTimeFormat(style = "S-")
private DateTime validTill;
}
查询的含义:代码在给定的时间有效性内是否唯一?"
Meaning of query: "Is the code unique in given time validity?"
如何重写此查询:
select count(o) from Entity o
where o <> :this and o.code = :code and (
(o.validFrom between :validFrom and :validTill and not o.suspended) or
(o.validTill between :validFrom and :validTill and not o.suspended) or
(:validFrom between o.validFrom and o.validTill and not o.suspended)
)
推荐答案
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Entity> cQuery = builder.createQuery(Entity.class);
Root<Entity> root = cQuery.from(Entity.class);
Predicate pValid1 = builder.between(root.get("ValidFrom"), validFrom, validTill);
Predicate pValid2 = builder.between(root.get("ValidTill"), validFrom, validTill);
Predicate pValid3 = builder.and(builder.lessThan(root.get("validTill"), balidFrom),builder.greaterThan(root.get("ValidFrom",validfrom)));
Predicate pSuspend = builder.not(root.get("Suspended"),true);
ExecutableQuery qFinal = em.createQuery(cQuery.select(root).where(builder.and(pSuspend,builder.or(pValid1,pvalid2,pvalid3))))
它应该以这种方式工作.尽管我还没有这样做,但是应该有可能改编元数据对象.
It should work this way. It should be possible to adapt the metadata object, although I didn't do that yet.
这篇关于如何使用JPA Criteria Query重写此查询?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文