我正在从一个非常规范化的数据库中读取一些值(我无法控制)。该调用检索大学部门的公告,如果用户在多个部门(可能),则对这些用户多次返回相同的结果。但是,有些部门可能会有不同的公告,而有些则有相同的公告。
我可以在单独的列上使用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值可能不同,但公告,日期等都是相同的。此查询返回具有重复值的公告。
答案 0 :(得分:1)
我提出两个问题的方法:
“选择不同的annoucement.x,annoucement.y,annoucement.z ...(没有depId)来自......“
然后构建公告。但是你 丢失了持久对象及其引用。你必须加载它们 如果你需要,可以再次使用你的Dao对象。
在你的Annoucement类中覆盖equals()[hashCode()) 当然,在equals()中,depId应该不在比较之中。越来越 如你所做的那样,然后将列表转换为Set。你得到了 “独特”对象
希望有所帮助
答案 1 :(得分:0)
在我看来,更好的方法是返回一个更具体的对象,只保留您感兴趣的列。另请参阅以下答案:
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