java - Hibernate 查询集合中的 ID 返回太多结果

标签 java hibernate

我有一个名为 Group 的实体类,它具有层次结构并使用 ID 引用来指示父级。我的 CriteriaQuery 返回太多结果(几乎所有组),而且我无法弄清楚我错过了什么。

getChildrenNames()方法通常会触发log.warn()警告。

每个组可以有 1 个或多个由 Group.parentID 定义的父组。实际上,通常有 0 或 1 个 parent 。

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

最佳答案

我终于发现问题出在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);
}

关于java - Hibernate 查询集合中的 ID 返回太多结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56974414/

相关文章:

java - java框架关闭后是否完全释放?

java - 读取/更新时的 Hibernate 并发(?)问题

java - Spring Snake 大小写转换不适用于外键列

java - 关于Java函数调用

java - 当鼠标放在 JButton 上时更改 JButton 背景颜色(不是鼠标悬停)

java - 如何在 Java 中从 XML 生成状态流程图?

java - 小程序 isShowing() 与框架 isShowing()

Hibernate HQL 查询空列

java - 使用 Hibernate 连接子类,是否可以复制 super 表和子表中的列*并*保持它们同步?

java - hibernate 4 : saveOrUpdate exception