Spring @OneToMany显示集合变量的重复值

Spring @OneToMany显示集合变量的重复值,spring,hibernate,jpa,Spring,Hibernate,Jpa,我得到的是经过筛选的“培训师”实体,但集合(trainedMonkeys)未经过筛选。”trainedMonkeys变量保存的是所有“Monkey”对象,而不是仅保存一个带有“isThumb=true”的对象 有人能检查我使用的以下标准是否正确吗 @SuppressWarnings("unchecked") public List<Trainer> listTrainers() { Criteria crit = sessio

我得到的是经过筛选的“培训师”实体,但集合(trainedMonkeys)未经过筛选。”trainedMonkeys变量保存的是所有“Monkey”对象,而不是仅保存一个带有“isThumb=true”的对象

有人能检查我使用的以下标准是否正确吗

@SuppressWarnings("unchecked")
    public List<Trainer> listTrainers() {         
        Criteria crit = sessionFactory.getCurrentSession().createCriteria(Trainer.class)
        .createAlias("trainedMonkeys", "tm")
        .add(Restrictions.eq("tm.isThumb", true))
        .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
Trainer.java

public class Trainer {  
    private Long trainerId;

    private String trainerName;

    public List<Monkey> trainedMonkeys;
Monkey.java

public class Monkey {

    private Long id;

    private String monkeyName;  

    private boolean isThumb;
我正在控制器中执行以下代码

for (Trainer trainer : trainerList){  
            System.err.println("<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>");  
            System.err.println("Trainer ID*****"+trainer.getTrainerId());  
            System.err.println("Trainer Name******"+trainer.getTrainerName());  
            monkeyList = trainer.getTrainedMonkeys();  
            for (Monkey monkey : monkeyList){  
                System.err.println("Monkey ID*****"+monkey.getId());  
                System.err.println("Monkey Name*****"+monkey.getMonkeyName());  
            }  
            System.err.println("<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>");  
        }
用于(培训师:培训师列表){
System.err.println(“>>>>>>>>”);
System.err.println(“培训师ID*****”+Trainer.getTrainerId());
System.err.println(“培训师名称******”+Trainer.getTrainerName());
monkeyList=trainer.getTrainedMonkeys();
(猴子:猴子名单){
System.err.println(“Monkey ID*****”+Monkey.getId());
System.err.println(“Monkey Name*****”+Monkey.getMonkeyName());
}  
System.err.println(“>>>>>”);
}
输出如下(Monkey_2和Monkey_6是唯一应该出现的对象,因为它们满足标准)请帮助

<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>> 
Trainer ID*****88 
Trainer Name******TrainerSachin 
Monkey ID*****87 
Monkey Name*****Monkey_1 
Monkey ID*****88 
Monkey Name*****Monkey_2 
Monkey ID*****89 
Monkey Name*****Monkey_3 
<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>> 
<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>> 
Trainer ID*****89 
Trainer Name******TrainerVinod 
Monkey ID*****90 
Monkey Name*****Monkey_5 
Monkey ID*****91 
Monkey Name*****Monkey_6 
Monkey ID*****92 
Monkey Name*****Monkey_7 
<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>
培训师ID****88
培训师姓名******培训师机器
猴子ID****87
猴子名称******猴子1
猴子ID****88
猴子名称******猴子2
猴子识别号******89
猴子名称******猴子3
>>>>>> 
>>>>>>>>>>>>> 
培训师ID****89
培训师姓名******培训师姓名
猴子ID****90
猴子名称******猴子5
猴子ID****91
猴子的名字******猴子6
猴子ID****92
猴子的名字******猴子7
>>>>>> 

它应该可以容纳所有内容。你误解了标准限制。限制筛选返回的实体应满足的标准。它们不会从返回的实体中的集合中过滤出元素

查询返回具有相关实体关系子集的实体将使事情变得复杂。考虑当这样一个实体被合并回数据库时应该发生什么


有关该主题的更多详细信息,请访问。

该主题应包含所有内容。你误解了标准限制。限制筛选返回的实体应满足的标准。它们不会从返回的实体中的集合中过滤出元素

查询返回具有相关实体关系子集的实体将使事情变得复杂。考虑当这样一个实体被合并回数据库时应该发生什么


有关主题的更多详细信息,请参见。

在hibernate配置中将hibernate.show_sql设置为true,让我们看看它正在运行什么sql。在hibernate配置中将hibernate.show_sql设置为true,让我们看看它正在运行什么sql。这是否意味着我无法实现所需的结果?我希望我的集合只包含符合条件“isThumb=true”的元素。控制台上的查询看起来也不错。当我在SQL编辑器上执行它时,它提供了两行。将此.ID选择为ID4\u 1\u,将此\u.trainer\u名称选择为trainer2\u 4\u 1\u,将trainedmon3\u.trainer\u ID选择为trainer1\u,将tm1\u.ID选择为monkey2\u,将tm1\u.ID选择为id5\u 0\u,将tm1\u.thumb选择为thumb5\u 0\u,tm1.ID=trainedmon3.ID=trainedmon3.ID=trainedmon3.ID=trainedmon3.ID=trainedmon3.ID内接monkey tm1.ID=tm1.ID,其中tm1.thumb=?选择trainedmon0.trainedmon0.ID为trainer1,trainedmon0.ID为monkey2.1,monkey1.ID为id5.thumb,monkey1.monkey\u名称为monkey3.5\u 0\u来自TrainedMonkeys trainedmon0\u左侧外部连接monkey monkey1\u on trainedmon0\u.monkey\u id=monkey1\u.id其中trainedmon0.trainer\u id=?是的,通常的方法是错误的。查询是关于选择哪些实体是结果的一部分。它们不是在作为结果一部分的实体中构建关系的工具。这是否意味着我无法达到预期的结果?我希望我的集合只包含符合条件“isThumb=true”的元素。控制台上的查询看起来也不错。当我在SQL编辑器上执行它时,它提供了两行。将此.ID选择为ID4\u 1\u,将此\u.trainer\u名称选择为trainer2\u 4\u 1\u,将trainedmon3\u.trainer\u ID选择为trainer1\u,将tm1\u.ID选择为monkey2\u,将tm1\u.ID选择为id5\u 0\u,将tm1\u.thumb选择为thumb5\u 0\u,tm1.ID=trainedmon3.ID=trainedmon3.ID=trainedmon3.ID=trainedmon3.ID=trainedmon3.ID内接monkey tm1.ID=tm1.ID,其中tm1.thumb=?选择trainedmon0.trainedmon0.ID为trainer1,trainedmon0.ID为monkey2.1,monkey1.ID为id5.thumb,monkey1.monkey\u名称为monkey3.5\u 0\u来自TrainedMonkeys trainedmon0\u左侧外部连接monkey monkey1\u on trainedmon0\u.monkey\u id=monkey1\u.id其中trainedmon0.trainer\u id=?是的,通常的方法是错误的。查询是关于选择哪些实体是结果的一部分。它们不是在作为结果一部分的实体中构建关系的工具。