2014-11-21 95 views
1

我有點麻煩。我正在使用JPA標準進行動態選擇(使用條件作爲where子句具有可選變量...),但我的實體之一有一個EmbeddedId,其中包含用戶列,其中需要檢查用戶ID ...JPA標準和EmbeddedId上的謂詞

這裏是我的實體。

@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]」

誰能告訴我怎麼可以加我「等於」謂詞用戶ID?

PS:這是PA查詢我要存檔:

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

謝謝!!

回答

2

您需要鏈接獲取。

Predicate predicate2 = cb.equal(ul.get("userLike").get("user").get("idUser"), userId); 
+0

感謝它的工作! – Johny19 2014-11-21 13:03:18