[英]Hibernate, OneToMany association - select issue
我有以下实体类:用户和类别。 用户可能有多个类别。 我需要组成一个查询来选择具有某些特定电子邮件和提取类别的用户,该类别的更新值大于我指定的值。
不幸的是,我收到一些奇怪的错误(从我的角度来看)。 这是一个查询:
String selectQuery = "from User as user left outer join user.categories as category with category.updated >= :after where user.email = :email";
User u = (User)sessionFactory.getCurrentSession().createQuery(selectQuery).
setString("email", email).
setCalendar("after", after).
setResultTransformer(RootEntityResultTransformer.INSTANCE).
uniqueResult();
return u;
我也尝试过以下查询:
String selectQuery = "from User as user left outer join user.categories as category where category.updated >= :after and user.email = :email";
我收到一条错误消息:
java.lang.ClassCastException: Category cannot be cast to User
有人有任何线索吗? 该错误消息对我来说似乎很奇怪,因为我是从用户而不是从类别中选择的。 PS当然,如果用户根本没有任何类别,查询应该可以工作。
以下是实体:
@Entity
@Table(name = "USER", uniqueConstraints = {
@UniqueConstraint(columnNames = {"EMAIL"})
})
public class User extends AbstractTimestampEntity implements Serializable {
public User() {
}
private Integer id;
private String email;
private Set<Category> categories = null;
@Id
@Column(name = "ID")
@GeneratedValue
public Integer getId() {
return id;
}
@NotEmpty
@Email
@Column(name = "EMAIL")
public String getEmail() {
return email;
}
@Cascade( { org.hibernate.annotations.CascadeType.PERSIST } )
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
public Set<Category> getCategories() {
return categories;
}
public void setId(Integer id) {
this.id = id;
}
public void setEmail(String email) {
this.email = email;
}
public void setCategories(Set<Category> categories) {
this.categories = categories;
}
}
@Entity
@Table(name = "CATEGORY")
public class Category extends AbstractTimestampEntity implements Serializable {
private Integer id;
private User user;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", unique = true, nullable = false)
public Integer getId() {
return id;
}
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
public User getUser() {
return user;
}
public void setId(Integer id) {
this.id = id;
}
public void setUser(User user) {
this.user = user;
}
}
@MappedSuperclass
public class AbstractTimestampEntity {
private Calendar created;
private Calendar updated;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "CREATED")
public Calendar getCreated() {
return created;
}
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "UPDATED")
public Calendar getUpdated() {
return updated;
}
public void setCreated(Calendar created) {
this.created = created;
}
public void setUpdated(Calendar updated) {
this.updated = updated;
}
}
先感谢您。 任何帮助将不胜感激。
“ FETCH”选项将始终检索用户的所有类别,您必须使用Java对其进行过滤:
String selectQuery =
"from User as user " +
"left join fetch user.categories as category " +
"where " +
" user.email = :email";
User user = (User) session.createQuery(selectQuery).
setString("email", email).
uniqueResult();
return user;
//then filter the user.categories by the after criteria
此查询无法过滤类别,因为左联接提取不允许您在where子句中使用别名。
为了提高查询效率,您需要放开“ FETCH”,这样您也可以过滤类别,但是这次您将无法检索带有“部分”类别视图的用户。 您要么获取所有孩子,要么不获取。
String selectQuery =
"select user, category " +
"from User as user " +
"left join user.categories as category with category.updated >= :after " +
"where " +
" user.email = :email";
List userAndCategories = session.createQuery(selectQuery).
setString("email", email).
setCalendar("after", after).
list();
//userAndCategories contains Object[] entries where the User is the Object[0] is the user and Object[1] is the Category
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.