2011-04-08 81 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