【问题标题】:Hibernate Query Not Projecting Correctly in One To ManyHibernate 查询在一对多中未正确投影
【发布时间】:2011-08-01 05:33:35
【问题描述】:

我正在做一个查询,我需要找回一个用户,其中也填充了 UserConnectors。我的查询不断返回两个结果,而不是单个 ID 的一个结果。这应该是一个结果,但我认为 UserConnector 加入,因为用户有两个,在结果中创建两个用户,每个用户连接器一个。

表格

用户:ID NAME 用户连接器:ID、用户ID、日期

用户.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);

【问题讨论】:

    标签: hibernate criteria one-to-many


    【解决方案1】:

    你可以试试这个吗?

      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();
    

    【讨论】:

    • 同样的事情: List list = userRepository.getCritieria() .add( Restrictions.idEq(request.getId())) .add( Restrictions.eq("enabled", new Long( "1"))) .createCriteria("userConnectors") .add( Restrictions.like("active", new Long("1")) ) .list();
    【解决方案2】:

    与 HQL 一样,对于带有连接的 Criteria,您需要手动触发不同的投影:

     criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);
    

    【讨论】:

    • 获取错误嵌套异常是 java.lang.NoSuchFieldError: INSTANCE。不过,您确实给了我一个想法,我尝试了 criteria.setResultTransformer(Criteria.ROOT_ENTITY),但它仍然给了我相同的结果。
    【解决方案3】:
    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    

    【讨论】:

      猜你喜欢
      • 2010-12-06
      • 2010-12-18
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      相关资源
      最近更新 更多