【问题标题】:unable to use hibernate group by in hibernate criteria in java无法在java中的休眠条件中使用休眠组
【发布时间】:2018-08-14 19:17:15
【问题描述】:

我有三个 bean 类作为 User、UserImages 和 UserLocation:

public class User implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    Long id;

    @NotNull
    String userName;

    ....
    ....

    @OneToOne(fetch=FetchType.LAZY,mappedBy="user")
    private UserLocation userLocationObj;

    @OneToMany(fetch=FetchType.LAZY,mappedBy="user")
    private List<UserImages> userImages ;

}



public class UserImages {

    @Id
    @GeneratedValue
    long id;

    @Column(name="user_id" , insertable=false , updatable=false)
    Long userId;

    @Column(name="pic_url")
    String picUrl;

    ....
    ....

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="user_id")
    private User user;
}



public class UserLocation implements Serializable{

    @Id
    @GeneratedValue
    Long id;

    @Column(name="user_id" , insertable=false , updatable=false)
    Long userId;

    ....
    ....

     @OneToOne(fetch=FetchType.LAZY)
     @JoinColumn(name="user_id")
     private User user;
}

我在用户中有大约 20 列。 我正在尝试使用 join 并获取所有使用 Hibernate Criteria 具有位置和图像的用户的所有记录,但不幸的是我无法在其中使用 group by 子句。 我用谷歌搜索并找到了指示使用 Projection 的 groupProperty 的解决方案,但如果我正在使用它,它只会给出 User 表的 id 和其他表的所有数据。 但我想要用户的所有数据以及其他表。目前这就是我在没有 groupProperty 的情况下尝试做的事情:

public List<User> getTravellersNearMe(Session session) {

   Criteria parentCriteria = session.createCriteria(User.class);
   Criteria firstChildCriteria = parentCriteria.createCriteria("userLocationObj", JoinType.LEFT_OUTER_JOIN);
   Criteria secondChildCriteria = parentCriteria.createCriteria("userImages", JoinType.LEFT_OUTER_JOIN);

   parentCriteria.setFirstResult(start);
   parentCriteria.setMaxResults(record);

   List<User> searchResults = (ArrayList<User>) parentCriteria.list();
   return searchResults;
}

通过使用这种方式,我会因为加入而得到重复记录。

这就是我尝试使用 groupProperty 的方式:

公共列表 getTravellersNearMe(Session session) {

   Criteria parentCriteria = session.createCriteria(User.class);
   Criteria firstChildCriteria = parentCriteria.createCriteria("userLocationObj", JoinType.LEFT_OUTER_JOIN);
   Criteria secondChildCriteria = parentCriteria.createCriteria("userImages", JoinType.LEFT_OUTER_JOIN);

   parentCriteria.setFirstResult(start);
   parentCriteria.setMaxResults(record);
   parentCriteria.setProjection( Projections.projectionList().add(Projections.groupProperty("id"))); 

   List<User> searchResults = (ArrayList<User>) parentCriteria.list();
   return searchResults;
}

通过这种方式,我只能从 User 表中获取 id 以及从其他两个表中获取所有数据。但我想要所有三个表中的所有数据。

谢谢

【问题讨论】:

    标签: hibernate group-by


    【解决方案1】:

    重点是使用groupProperty(),以及Projections类提供的相关聚合函数。

    例如:

     SELECT column_name, max(column_name) , min (column_name) , count(column_name)
    FROM table_name
    WHERE column_name > xxxxx
    GROUP BY column_name
    

    它的等价条件对象是:

    List result = session.createCriteria(SomeTable.class)       
                        .add(Restrictions.ge("someColumn", xxxxx))      
                        .setProjection(Projections.projectionList()
                                .add(Projections.groupProperty("someColumn"))
                                .add(Projections.max("someColumn"))
                                .add(Projections.min("someColumn"))
                                .add(Projections.count("someColumn"))           
                        ).list();
    

    【讨论】:

    • 我认为您没有正确回答问题。我询问了如何通过在休眠条件中使用 group by 来获取所有表的所有数据。您的解决方案仅提供特定列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2013-07-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    相关资源
    最近更新 更多