Запрос гибернации для идентификатора в коллекции возвращает слишком много результатов - PullRequest
0 голосов
/ 10 июля 2019

У меня есть класс сущности под названием Group, который имеет иерархию и использует ссылки ID для указания родителя. Мой CriteriaQuery возвращает слишком много результатов (почти все группы), и я не могу понять, чего мне не хватает.

Метод getChildrenNames () обычно вызывает предупреждение log.warn ().

Каждая группа может иметь 1 или более родителей, которые определены в Group.parentID. На практике обычно есть 0 или 1 родитель.

public List<String> getChildrenNames(Group group) {
    CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
    CriteriaQuery<String> criteriaQuery = builder.createQuery(String.class);
    Root<Group> root = criteriaQuery.from(Group.class);

    criteriaQuery.where( createParentPredicate(group, criteriaQuery) );
    /*
     * Return only the group names not the entire Group entity 
     */
    criteriaQuery.select(root.get(GroupModelAttributes.COL_NAME));

    List<String> results = getEntityManager().createQuery(criteriaQuery).getResultList();

    if (results != null && results.size() > 100)
        log.warn("Detected unusually large number of children names for group \"%s\" COUNT: %d", 
                group.getName(), results.size());

    return results != null && results.size() > 0 ? results : null;
}

private Predicate createParentPredicate(Group group, CriteriaQuery<?> criteriaQuery) {
    String groupID = group.getID();
    Validate.notNull(groupID, "Group has no ID: " + group);
    String column = GroupModelAttributes.COL_PARENTIDS;
    CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
    Root<Group> root = criteriaQuery.from(Group.class);
    Expression<Collection<String>> colLoc = root.get(column);
    return builder.isMember(groupID, colLoc);
}

@Entity()
@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "name" }),
        @UniqueConstraint(columnNames = { "iD" }) }, name = "T_Group")
public class Group {
    @Basic()
    @Column(name = "ID")
    private String iD = null;

    @Basic()
    @Column(name = "Name")
    private String name = null;

    @ElementCollection(fetch = FetchType.EAGER)
    @Column(name = "T_element")
    @CollectionTable(joinColumns = { @JoinColumn(name = "Group_id") }, name = "Group_ParentIDs")
    private Set<String> parentIDs = new HashSet<String>();
}

1 Ответ

0 голосов
/ 21 июля 2019

Я наконец обнаружил, что проблема была в createParentPredicate (), я создал новый экземпляр Root.Вот рабочая createParentPredicate ():

private Predicate createParentPredicate(Group group, Root<?> root) {
        String groupID = group.getID();
        Validate.notNull(groupID, "Group has no ID: " + group);
        String column = GroupModelAttributes.COL_PARENTIDS;

        return root.join(column).in(groupID);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...