【发布时间】:2013-01-24 08:25:49
【问题描述】:
这些是我的(缩写)实体:
@Entity
public class User {
@OneToMany(fetch=FetchType.LAZY)
@JoinTable(name="user_items",joinColumns=@JoinColumn(name="user_id"),inverseJoinColumns=@JoinColumn(name="useritem_id"))
private Set<UserItem> items = Sets.newHashSet();
}
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class UserItem {
@Id
@Type(type=EntityConstants.TYPE_UUID)
@Column(columnDefinition=EntityConstants.COL_UUID)
private UUID id;
}
@Entity
public class UserItemFurniture extends UserItem {
}
现在我想通过它的 UUID 获得一个UserItemFurniture,但前提是它存在一个User 的items。这是我的尝试:
em
.createQuery(
"SELECT f " +
"FROM UserItemFurniture f " +
"WHERE f.id = :iid " +
"AND f IN (SELECT u.items FROM User u WHERE u.id = :uid) ",
UserItemFurniture.class
)
.setParameter("uid", userId)
.setParameter("iid", itemId)
.getSingleResult();
但它会生成这个无意义的 SQL:
select useritemfu0_.id as id17_, useritemfu0_1_.item as item17_, useritemfu0_.roomNumber as roomNumber18_, useritemfu0_.x as x18_, useritemfu0_.y as y18_
from UserItemFurniture useritemfu0_ inner join UserItem useritemfu0_1_ on useritemfu0_.id=useritemfu0_1_.id
where useritemfu0_.id=? and (useritemfu0_.id in (
select .
from _User user1_, user_items items2_, UserItem useritem3_
where user1_.id=items2_.user_id and items2_.useritem_id=useritem3_.id and user1_.id=?
))
limit ?
(注意子查询:SELECT .)
我可以在不使用本机或多个查询的情况下做到这一点吗?请注意,UserItem 没有引用 User,这是设计使然。
【问题讨论】:
-
您是否尝试过通过
id限制IN子句?类似...AND f.id IN (SELECT u.items.id FROM User ... -
不可能使用 u.items.id,因为作为集合值路径的项目是指整个集合,因此它没有属性 id(即使集合的元素也有)。
标签: java hibernate postgresql jpa jpql