4

これらは私の(省略された)エンティティです:

@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。これは仕様によるものです。

4

1 に答える 1

1

次のクエリを使用できます。

SELECT f
FROM UserItemFurniture f
WHERE f.id = :uid AND EXISTS 
  (SELECT u FROM User u
   WHERE u.id = :iid and f MEMBER OF u.items)
于 2013-02-12T19:59:18.670 に答える