Я хочу сделать простой запрос 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, полученный из диспетчера сущностей, в качестве параметра запроса. Действительно ли параметр «тег» должен быть управляемым объектом? Зачем? Как я могу заставить запрос работать? Спасибо вам, ребята, за помощь!
[EDIT:]
Спасибо за ваши советы. Я теперь закончил с этим запросом:
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;
}