2012-07-03 3 views
1

'트레이너'엔티티는 필터링되었지만 콜렉션 (trainedMonkeys)은 필터링되지 않습니다. 'trainedMonkeys'변수는 'isThumb = true'를 가진 객체 만 보유하는 대신 모든 'Monkey'객체를 보유합니다.@OneToMany는 콜렉션 변수에 중복 값을 표시합니다.

누군가 아래의 기준이 올바른지 확인해주세요.

@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); 

출력은 아래와 같다

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

및 Trainer.java

public class Trainer { 
    private Long trainerId; 

    private String trainerName; 

    public List&lt;Monkey&gt; trainedMonkeys; 

Monkey.java

public class Monkey { 

    private Long id; 

    private String monkeyName; 

    private boolean isThumb; 

I 컨트롤러 코드 아래 실행하고, (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 
<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>> 
+0

하이버 네이트 설정에서 hibernate.show_sql을 true로 설정하고 실행중인 sql을 보자. – user472749

답변

1

모두 보유해야합니다. 귀하는 기준 제한을 잘못 해석 한 것입니다. 반환 된 엔티티가 충족해야하는 기준을 필터링합니다. 반환 된 항목의 컬렉션에서 요소를 필터링하지 않습니다.

관계 엔티티와의 관계의 서브 세트로 조회 엔티티를 리턴하면 상황이 복잡해집니다. 그러한 엔티티가 다시 데이터베이스로 병합 될 때 어떤 일이 발생해야하는지 생각하십시오.

제목에 대한 자세한 내용은 Hibernate documentation에서 찾을 수 있습니다.

+0

원하는 결과를 얻을 수 없다는 뜻입니까? 내 컬렉션에 'isThumb = true'와 같은 기준과 일치하는 요소 만 보관되기를 원합니다. 또한 콘솔의 쿼리가 잘 보입니다. 그것은 SQL 편집기에서 실행할 때 두 개의 행을 제공합니다. – Sachin

+0

이 ID를 ID4_1_로, this_.trainer_name을 trainer2_4_1_, trainedmon3_.trainer_id를 trainer1_, tm1_.id를 monkey2_, tm1_.id를 id5_0_, tm1_.thumb을 thumb5_0_, tm1_.monkey_name을 monkey3_5_0_에서 트레이너 this_ inner join TrainedMonkeys trainedmon3_ on this_.ID = trainedmon3_.trainer_id inner join monkey tm1_ on trainedmon3_.monkey_id = tm1_.id 여기서 tm1_.thumb =? – Sachin

+0

trained10_으로 trainedmon0_.trainer_id를 선택하십시오. trained1_1_으로 trainedmon0_.monkey_id, id5_0_으로 monkey1_.id, thumb5_0_으로 monkey1_.thumb, monkey1_.monkey_name as monkey3_5_0_ as trainedMonkeys trainedmon0_ 왼쪽 외부 조인 원숭이 monkey1_ on trainedmon0_.monkey_id = monkey1_.id where trainedmon0_. trainer_id =? – Sachin

관련 문제