Hibernate Criteria,分组/选择父母的不同子女

时间:2015-04-19 21:27:08

标签: java hibernate hibernate-criteria hibernate-4.x

我有一个模型Parent,它有一个Children列表(List

class Parent {
   @OneToMany(targetEntity = Child.class, cascade = CascadeType.ALL, mappedBy = "parent")
   @JsonManagedReference
   private List<Child> tags =  new ArrayList<>();

   @Column(name = "name")
   public String name;

}

class Child {
     @Column(name = "name")
     public String name;

     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "parent_id", nullable = true)
     @JsonBackReference
     private Parent parent;
}

我在EAGER模式下选择包含子项的父项列表(List&lt; Parent&gt;)。

现在,儿童可以使用相同的名称,但我不希望名称相同的儿童在列表中多次出现。 有任何建议如何在集合中只有一次具有相同名称的孩子吗?

1 个答案:

答案 0 :(得分:1)

以下是使用set删除重复值的示例代码。如果firstName存在,则忽略第二个条目。您可以根据需要进行修改。

然而,虽然这是你问过的问题的答案,但请注意这里有代码味道。 他们确实你必须在代码中执行此操作,而数据库允许它是有问题的并且几乎可以保证设计缺陷。

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Test
{
    private String firstName;
    private String lastName;


    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((firstName == null) ? 0 : firstName.hashCode());
        return result;
    }


    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Test other = (Test) obj;
        if (firstName == null) {
            if (other.firstName != null)
                return false;
        } else if (!firstName.equals(other.firstName))
            return false;
        return true;
    }


    public Test(String firstName, String lastName) {
        super();
        this.firstName = firstName;
        this.lastName = lastName;
    }


    public static void main(String[] args)
    {
        List<Test> aList = new ArrayList<Test>();
        Test test1 = new Test("Tom","Hardy");
        Test test2 = new Test("Tom","Cruise");
        Test test3 = new Test("Any","Body");
        aList.add(test1);
        aList.add(test2);
        aList.add(test3);

        System.out.println("List values:");
        for (Test test : aList)
        {
            System.out.println(test.firstName + "-"+ test.lastName);
        }
        Set<Test> alphaSet = new HashSet<Test>(aList);
        System.out.println("Set values:");
        for (Test test : alphaSet)
        {
            System.out.println(test.firstName + "-"+ test.lastName);
        }
    }
}