2011-04-08 84 views
1

我正在做一個查詢,我需要找回用戶,也有用戶連接器填充它。我的查詢不斷爲一個ID帶回兩個結果,而不是一個結果。它應該是一個結果,但我認爲UserConnector加入是因爲用戶有兩個用戶連接,所以在結果中創建兩個用戶,每個用戶連接一個。休眠查詢不能正確投影在一對多

用戶:ID NAME UserConnector:ID,USERID,DATE

User.java

@OneToMany(mappedBy="user") 
    public Set<UserConnector> getUserConnectors() { 
     return this.userConnectors; 
    } 

    /** 
    * Set the list of Connectors 
    */ 
    public void setUserConnectors(Set<UserConnector> userConnectors) { 
     this.userConnectors = userConnectors; 
    } 

UserConnector.java

@ManyToOne 
@JoinColumn(name = "USERID") 
public User getUser() { 
    return this.user; 
} 

/** 
* set users 
*/ 
public void setUser(User user) { 
    this.user = user; 
} 

查詢

Criteria criteria = userRepository.getCritieria(); 

      criteria.createAlias("userConnectors", "uc", Criteria.LEFT_JOIN); 

      criteria.add(Restrictions.eq("id", request.getId())); 
      criteria.add(Restrictions.eq("enabled", new Long("1"))); 
      criteria.add(Restrictions.eq("uc.active", new Long("1"))); 

      List<User> list = userRepository.findByCriteria(criteria); 

回答

0
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
0

你可以試試這個嗎?

List users = session.createCriteria(User.class) 
    .add(Restrictions.idEq(request.getId())) 
    .add(Restrictions.eq("enabled", new Long("1"))) 
    .createCriteria("userConnectors") 
     .add(Restrictions.like("active", new Long("1"))) 
    .list(); 
+0

同一件事: 列表列表= userRepository.getCritieria() (Restrictions.idEq(request.getId())) \t \t個\t。新增(Restrictions.eq( 「已啓用」,新長征( 「1」))) \t \t \t .createCriteria( 「userConnectors」) \t \t \t。新增(Restrictions.like( 「激活」,新長征(「1」))) \t \t \t .list(); – 2011-04-08 05:45:23

0

以及與HQL,爲Criteria與連接,你需要手動觸發不同的投影:

criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE); 
+0

獲取錯誤嵌套異常是java.lang.NoSuchFieldError:INSTANCE。你確實給了我一個想法,雖然我嘗試了criteria.setResultTransformer(Criteria.ROOT_ENTITY),但它仍然給了我相同的結果。 – 2011-04-08 21:20:54