Hibernate Query не проецируется правильно в один ко многим - PullRequest
1 голос
/ 08 апреля 2011

Я делаю запрос, в котором мне нужно вернуть пользователя, который также содержит UserConnectors.Мой запрос возвращает два результата вместо одного для одного идентификатора.Это должен быть один результат, но я думаю, что соединение UserConnector, поскольку у пользователя их два, создает в результате двух пользователей, по одному для каждого соединителя пользователя.

Таблицы

Пользователь: IDИМЯ UserConnector: ID, USERID, ДАТА

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

Ответы [ 3 ]

0 голосов
/ 08 апреля 2011

Как и в случае с HQL, для Criteria с объединениями необходимо вручную запустить отдельную проекцию:

 criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);
0 голосов
/ 09 апреля 2011
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
0 голосов
/ 08 апреля 2011

Можете ли вы попробовать это?

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