У меня есть класс сущности под названием 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>();
}