【问题标题】:How to rewrite this query using JPA Criteria Query?如何使用 JPA Criteria Query 重写此查询?
【发布时间】:2011-08-01 10:43:04
【问题描述】:
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;
}

查询含义:“代码在给定时间内是否唯一有效?”

如何重写这个查询:

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

【问题讨论】:

    标签: jpa criteriaquery


    【解决方案1】:
    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))))
    

    它应该以这种方式工作。应该可以调整元数据对象,虽然我还没有这样做。

    【讨论】:

    • 我收到错误“无法在(javax.persistence.criteria.Path, java.util.Date, java.util.Date)之间解析方法”。
    • 是的,我知道:javax.persistence.criteria.CriteriaBuilder 但我在 Predicate pValid1、pValid2、pValid3 处收到此错误,我不知道为什么。您是否尝试编译您的示例?
    • @Vlada 仔细看了看。要么使用静态元数据功能,要么使用 root.get root.&lt;Date&gt;get("... 的通用分类
    • 谢谢,现在可以编译了。 (我使用root。get("...)
    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 2013-08-20
    • 2012-11-28
    • 2012-09-07
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2013-03-19
    相关资源
    最近更新 更多