Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPA中对单个列使用DISTINCT关键字_Java_Hibernate_Jpa_Jpa 2.0_Jpql - Fatal编程技术网

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

Java 在JPA中对单个列使用DISTINCT关键字,java,hibernate,jpa,jpa-2.0,jpql,Java,Hibernate,Jpa,Jpa 2.0,Jpql,我正在从一个数据库中读取一些非常不规范的值(我无法控制)。该调用检索大学部门的公告,如果用户在多个部门(这是可能的),那么这些用户多次返回相同的结果。但是,有些部门可能有不同的公告,而有些部门则有相同的公告 我有没有办法在JPA中的各个列上使用DISTINCT关键字?这是我目前查询的内容: String jpql = "SELECT DISTINCT annoucement FROM Announcment announcement " + "WHERE (ann

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

我有没有办法在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);
String jpql=“从公告公告中选择不同的公告”
+“其中(announcement.date=:now)”
+“AND announcement.approved=true和(:departmentId)”中的announcement.departmentId”;
TypedQuery query=entityManager.createQuery(jpql,
公告(课堂),;
setParameter(“现在”,新日期());
query.setParameter(“部门ID”,部门ID);

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

我有两种方法来解决你的问题:

  • 选择不同的annoucement.x、annoucement.y、annoucement.z “…(无depId)来自…”

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

  • 例如,在Annoucement类中重写equals()[hashCode() 当然,在equals()中,depId应该不在比较范围内。得到 按您所做的方式创建列表,然后将列表转换为Set。你有 “不同”对象


  • 希望它能有所帮助

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

    根据您的示例,您可以仅使用感兴趣的列创建新对象:

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

    你知道你偶然使用的JPA版本吗?Hibernate 3.6.6和Hibernate-JPA-2.0-api-1.0.1.Final.jarIt花了我一段时间,但我回去用建议2解决了这个问题。谢谢