【发布时间】: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 以及从其他两个表中获取所有数据。但我想要所有三个表中的所有数据。
谢谢
【问题讨论】: