【发布时间】:2012-02-02 11:42:46
【问题描述】:
我想做一个简单的 JPA MEMBER OF 查询,但我一辈子都无法让它工作。 Hibernate 抛出 TransientObjectException 并显示消息“对象引用了未保存的瞬态实例 - 在刷新之前保存实例:标记”。查询如下:
public Collection<ItemDescription> getItems(){
String entityClass = "ItemDescription";
TypedQuery<ItemDescription> query = entityManager.createQuery(
"SELECT i FROM " + entityClass +" i " +
"WHERE :tag MEMBER OF i.tags", ItemDescription.class);
query.setParameter("tag", new Tag("category:test"));
List<ItemDescription> resultList = query.getResultList();
return resultList;
}
两个实体类如下:
@Entity
@Table(name = "tags")
public class Tag extends AbstractDomainEntity {
private static final long serialVersionUID = 2632379096725992272L;
private String value;
...
}
@Entity
@Table(name = "itemdescriptions")
public class ItemDescription extends AbstractDomainEntity {
private static final long serialVersionUID = 9164310940207023539L;
private Set<Tag> tags = new HashSet<Tag>();
...
@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL, orphanRemoval = true)
public Set<Tag> getTags() {
return tags;
}
private void setTags(Set<Tag> tags) {
this.tags = tags;
}
}
当我使用从实体管理器中检索到的 Tag 对象作为查询参数时,相同的查询会起作用。 “标签”参数真的必须是托管实体吗?为什么?我怎样才能让查询工作?谢谢大家的帮助!
[编辑:] 谢谢你的提示。我现在结束了这个查询:
public Collection<ItemDescription> getItems(){
String entityClass = "ItemDescription";
TypedQuery<ItemDescription> query = entityManager.createQuery(
"SELECT i FROM " + entityClass +" i " +
"JOIN i.tags t " +
"WHERE t.value = :tag", ItemDescription.class);
query.setParameter("tag", "category:test");
List<ItemDescription> resultList = query.getResultList();
return resultList;
}
【问题讨论】: