[英]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.