【问题标题】:Using DISTINCT keyword in JPA on individual columns在 JPA 中对各个列使用 DISTINCT 关键字
【发布时间】:2012-03-03 02:51:50
【问题描述】:

我正在从一个非常未标准化(我无法控制)的数据库中读取一些值。该调用检索大学部门的通知,如果用户在多个部门(这是可能的),则为这些用户多次返回相同的结果。但是,有些部门可能有不同的公告,而有些则相同。

有没有办法让我在 JPA 中的各个列上使用 DISTINCT 关键字?这是我目前的查询:

String jpql = "SELECT DISTINCT annoucement FROM Announcment announcement "
                + "WHERE (announcement.date <= :now AND announcement.endDate >= :now) "
                + "AND announcement.approved = true AND announcement.departmentId IN (:departmentIDs)";

TypedQuery<Announcement> query = entityManager.createQuery(jpql,
                Announcement.class);
query.setParameter("now", new Date());
query.setParameter("departmentIDs", departmentIDs);

departmentID 值可能不同,但公告、日期等都是相同的。此查询返回具有重复值的公告。

【问题讨论】:

  • 你知道你使用的JPA是哪个版本吗?
  • Hibernate 3.6.6 和 hibernate-jpa-2.0-api-1.0.1.Final.jar

标签: java hibernate jpa jpa-2.0 jpql


【解决方案1】:

在我看来,更好的方法是返回一个只包含您感兴趣的列的更具体的对象。另请参阅以下答案:

JPQL Constructor Expression - org.hibernate.hql.ast.QuerySyntaxException:Table is not mapped

根据您的示例,您可以创建一个仅包含您感兴趣的列的新对象:

SELECT DISTINCT new com.mypackage.MyInterestingAnnouncement(annoucement.x, annoucement.y, annoucement.z) FROM Announcment annoucement

【讨论】:

    【解决方案2】:

    我有两种方法可以解决您的问题:

    1. "选择不同的annoucement.x, annoucement.y, annoucement.z ...(没有 depId)来自...”

      然后构建一个公告。但是你 丢失了持久对象及其引用。你必须加载它们 如果需要,请再次使用您的道对象。

    2. 在你的 Annoucement 类中覆盖 equals() [hashCode() too] 当然,在 equals() 中,depId 应该不在比较范围内。得到 像你一样的列表,然后将列表转换为 Set。你得到了 “不同”的对象

    希望对你有帮助

    【讨论】:

    • 我花了一段时间,但我回去并使用建议 #2 解决了这个问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2011-03-06
    相关资源
    最近更新 更多