在JPA中对各个列使用DISTINCT关键字

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

有没有办法在单独的列上使用JPA中的DISTINCT关键字? 这是我目前用于查询的内容:

String jpql = "SELECT DISTINCT annoucement FROM Announcment announcement " + "WHERE (announcement.date = :now) " + "AND announcement.approved = true AND announcement.departmentId IN (:departmentIDs)"; TypedQuery query = entityManager.createQuery(jpql, Announcement.class); query.setParameter("now", new Date()); query.setParameter("departmentIDs", departmentIDs); 

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

我提出两个问题的方法:

  1. “选择明确的annoucement.x,annoucement.y,annoucement.z …(没有depId)来自…”

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

  2. 在你的Annoucement类中覆盖equals()[hashCode()也是如此,当然,在equals()中,depId应该不在比较中。 像你一样获取列表,然后将列表转换为Set。 你有“独特”的对象

希望能帮助到你

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

JPQL构造函数表达式 – org.hibernate.hql.ast.QuerySyntaxException:表未映射

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

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