5

少し困っています。JPA Criteria を使用して動的選択を行っています (where 句にはオプションの変数があるため、基準を使用しています...) が、エンティティの 1 つに、ユーザー列を含む EmbeddedId があり、ユーザー ID を確認する必要があります...

ここに私のエンティティがあります。

@Entity
@Table(name = "user_like") 
public class UserLike extends AbstractTimestampEntity implements Serializable {

  @EmbeddedId
   private UserLike.userLikePK userLikePK= new UserLike.UserLikePK();
   ...
   with all the setter and gets
   ...

   @Embeddable
   public static class UserLike implements Serializable{
      @ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.LAZY)
      @JoinColumn(name = "user_id")
      private User user;

      ... (and an other column, not important for now=
   }   
}

ユーザーは、列 userId を含む別のエンティティです

これが私のクエリの外観です。

Root<Poi> p = cq.from(Poi.class);
Join<Poi,UserLike> ul = p.join("userLike");


 List<Predicate> predicates = new ArrayList<Predicate>();
 Predicate predicate = cb.like(cb.upper(p.<String>get("name")), "%" + poiName.toUpperCase() + "%");
 predicates.add(predicate);

 Predicate predicate2 = cb.equal(ul.get("userLikePK.user.idUser"), userId);
 predicates.add(predicate);

 //multi select because i need some info from p and ul as well....
 cq.multiselect(p, ul);

predicate2 は明らかに「指定された名前 [userPoiLikePK.user.idUser] の属性が見つかりません」というエラーをスローします。

userID に「等しい」述語を追加する方法を教えてもらえますか?

ps: これはアーカイブしたい pa クエリです:

SELECT p,ul FROM Poi p LEFT JOIN p.userLike ul WHERE p.name like :name AND ul.user.idUser=:userId

ありがとうございました!!

4

1 に答える 1

10

get をチェーンする必要があります。

Predicate predicate2 = cb.equal(ul.get("userLike").get("user").get("idUser"), userId);
于 2014-11-21T12:51:53.870 に答える