Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠条件,对父级的不同子级进行分组/选择_Java_Hibernate_Hibernate Criteria_Hibernate 4.x - Fatal编程技术网

Java 休眠条件,对父级的不同子级进行分组/选择

Java 休眠条件,对父级的不同子级进行分组/选择,java,hibernate,hibernate-criteria,hibernate-4.x,Java,Hibernate,Hibernate Criteria,Hibernate 4.x,我有一个模型家长,它有一个孩子列表(列表 我选择了一个家长列表(list),其中的孩子处于急切模式 现在,孩子们可以有相同的名字,但我不希望有相同名字的孩子在列表中出现不止一次。 关于如何在集合中只使用一次同名子项的任何建议?以下是使用set删除重复值的示例代码。如果存在firstName,则忽略第二个条目。您可以根据需要修改If 然而,虽然这是您所问问题的答案,但请注意,这里有一种代码味道。事实上,您必须在代码中这样做,而数据库允许这样做是有问题的,几乎可以保证存在设计缺陷。 import j

我有一个模型家长,它有一个孩子列表(列表 我选择了一个家长列表(list),其中的孩子处于急切模式

现在,孩子们可以有相同的名字,但我不希望有相同名字的孩子在列表中出现不止一次。
关于如何在集合中只使用一次同名子项的任何建议?

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

然而,虽然这是您所问问题的答案,但请注意,这里有一种代码味道。事实上,您必须在代码中这样做,而数据库允许这样做是有问题的,几乎可以保证存在设计缺陷。

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);
        }
    }
}
import java.util.ArrayList;
导入java.util.HashSet;
导入java.util.List;
导入java.util.Set;
公开课考试
{
私有字符串名;
私有字符串lastName;
@凌驾
公共int hashCode(){
最终整数素数=31;
int结果=1;
结果=素数*结果
+((firstName==null)?0:firstName.hashCode());
返回结果;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
测试其他=(测试)obj;
if(firstName==null){
if(other.firstName!=null)
返回false;
}else如果(!firstName.equals(other.firstName))
返回false;
返回true;
}
公共测试(字符串名、字符串名){
超级();
this.firstName=firstName;
this.lastName=lastName;
}
公共静态void main(字符串[]args)
{
列表列表=新的ArrayList();
测试1=新测试(“汤姆”、“哈迪”);
测试2=新测试(“Tom”、“Cruise”);
测试3=新测试(“任何”、“主体”);
aList.add(test1);
aList.add(test2);
aList.add(test3);
System.out.println(“列表值:”);
用于(测试:aList)
{
System.out.println(test.firstName+“-”+test.lastName);
}
Set alphaSet=新哈希集(列表);
System.out.println(“设置值:”);
用于(测试:alphaSet)
{
System.out.println(test.firstName+“-”+test.lastName);
}
}
}

<代码> >您应该用java <代码> SET/COD>存储<代码>子<代码>;另外,对于< <代码>的实现等于和 HASCOD> <代码>(对于该实体),数据库是否允许重复名称?如果没有,则考虑使用<代码> @列(name =“name”,唯一= true)。
@Machina是的,但是如何从Hibernate条件返回一组?@Shahzeb-是的,数据库允许重复名称。@Sergiu,我在这里看到一些不匹配的情况:数据库中可以有许多具有相同/重复名称的
孩子,并且可以将这些孩子(甚至重复)与同一父代关联。因为没有办法(AFAIK)要从Hibernate条件查询返回
Set
,我建议您使用类似于:
setProjection(Projections.distinct(Projections.property(“name”))
…并且仍然在您的模型中使用
。谢谢您的回答。我发现这非常有用。我同意设计缺陷。我已经找到了一个很好的解决方案,我将设置许多父-子关系,这将消除重复。我不知道为什么我之前没有想到这一点。谢谢!
class Child {
     @Column(name = "name")
     public String name;

     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "parent_id", nullable = true)
     @JsonBackReference
     private Parent parent;
}
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);
        }
    }
}