【问题标题】:Hibernate criteria and/or with many-to-many休眠标准和/或多对多
【发布时间】:2014-09-30 19:15:01
【问题描述】:

这是我正在运行的查询:

    List<Coupon> coupons = getDb().createCriteria(Coupon.class)
    .add(Restrictions.le("validFrom", startTime.getTime()))
    .add(Restrictions.ge("validUntil", startTime.getTime()))
    .add(Restrictions.eq("user", user))
    .createAlias("spots", "spotsAlias")
    .add(Restrictions.or(
            Restrictions.eq("isGlobal", true),
            Restrictions.eq("spotsAlias.id", spot.getId())
            ))
    .add(Restrictions.eq("isRedeemed", false))
    .add(Restrictions.eq("isDeleted", false))
    .add(Restrictions.eq("isActive", true))
    .addOrder(Order.asc("isGlobal"))
    .addOrder(Order.desc("validFrom"))
    .list();

它应该得到的所有优惠券是:

  • 开始时有效
  • 与用户相关
  • 全局或与特定地点相关
  • 未兑换
  • 未删除
  • 已激活

优惠券与景点是多对多的关系。关系有效 - 此查询确实返回与查询地点特别相关的优惠券。不幸的是,它从不返回全局优惠券,即使数据库中根本没有“本地”优惠券。

有什么建议吗?非常感谢您的帮助!

【问题讨论】:

  • 尝试使用 disjunction()?

标签: java mysql hibernate many-to-many hibernate-criteria


【解决方案1】:

尝试使用析取并查看:

 .add( Restrictions.disjunction().add(Restrictions.eq("global", Boolean.TRUE))
                              .add(Restrictions.eq("spotsAlias.id", spot.getId())))

此外,如果 global 是您的实体中的一个属性,那么您需要使用:

Restrictions.eq("global", Boolean.TRUE)

另外,如果你引用Restrictions类,它只有

eq(String propertyName, Object value) 

将对象作为第二个参数而不是原始类型的方法。

【讨论】:

  • 没有。还是一样的结果。不返回 isGlobal=true 的优惠券。
  • 是你实体中的全局属性吗?
  • "无法解析属性:全局:com.pinkpark.model.Coupon"
  • 是的,请在您的所有限制和您的 Order.asc(propertyName) / Order.desc(propertyName) 中使用 (propertyName, object)
  • 你用 Boolean.TRUE 代替 true 吗?现在你正在将原始类型传递给一个接受对象作为第二个参数的方法。
猜你喜欢
  • 2011-04-12
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多