2010-09-25 4 views
1

Im обучение JPA и наличие проблем. Моя основная проблема заключается в том, когда я присоединяюсь к своим сущностям и не понимаю, почему я получаю результаты, я ... и это реально замедляет мой прогресс, если кто-то может помочь, я был бы очень благодарен.неожиданные результаты JPA

Entitys

Колледж

@Entity 
@NamedQueries({ 
    @NamedQuery(name=College.allCollegeQuery,query="SELECT col FROM College col"), 
    @NamedQuery(name=College.collegeStudentJoinQuery,query="SELECT DISTINCT col FROM College col JOIN FETCH col.students"), 
    @NamedQuery(name=College.collegeStudentBasicJoinQuery,query="SELECT col FROM College col JOIN col.students s") 
}) 
public class College { 

    public static final String allCollegeQuery = "allCollegeQuery"; 
    public static final String collegeStudentJoinQuery = "collegeStudentJoinQuery"; 
    public static final String collegeStudentBasicJoinQuery = "collegeStudentBasicJoinQuery"; 

    @Id 
    @GeneratedValue 
    private long id; 
    private String name; 

    @OneToMany(mappedBy="college") 
    private List<Student> students; 

    public long getId() { 
     return id; 
    } 
    public void setId(long id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

    public List<Student> getStudents() { 
     return students; 
    } 
} 

Student

@Entity 
@NamedQueries({ 
    @NamedQuery(name=Student.allStudentsQuery, query="SELECT stu FROM Student stu"), 
    @NamedQuery(name=Student.studentsCollageQuery, query="SELECT stu.college FROM Student stu WHERE stu.id = :id"), 
    @NamedQuery(name=Student.studentsWithCollageIDQuery, query="SELECT stu FROM Student stu WHERE stu.college.id = :id") 
}) 
public class Student { 

    public static final String allStudentsQuery = "allStudentsquery"; 
    public static final String studentsCollageQuery = "studentsCollageQuery"; 
    public static final String studentsWithCollageIDQuery = "studentsCollagewithIDQuery"; 

    @Id 
    @GeneratedValue 
    private long id; 
    private String name; 

    @ManyToOne 
    private College college; 

    public long getId() { 
     return id; 
    } 
    public void setId(long id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

    public College getCollege() { 
     return college; 
    } 
    @XmlTransient 
     public void setCollege(College college) { 
      this.college = college; 
     } 
    } 

Ok так что моя цель состоит в том, чтобы запросить все колледжа и вернуть всех студентов, связанных с ними. Что я ожидал, что мой именованный запрос, чтобы сделать

SELECT col FROM College col JOIN col.students s 

Мой Быстродействие был (вызывается через GlassFish интерфейс Tester)

<return> 
     <id>1</id> 
     <name>"Bournemouth</name> 
    </return> 
    <return> 
     <id>1</id> 
     <name>"Bournemouth</name> 
    </return> 
    <return> 
     <id>1</id> 
     <name>"Bournemouth</name> 
    </return> 
    <return> 
     <id>1</id> 
     <name>"Bournemouth</name> 
    </return> 

Как вы можете imágen этот колледж существует только один раз в базе данных, но я знаю, к этому колледжу присоединяются четыре студента (которые, я думаю, почему они повторяются). решение я и отчасти в надежде на бы Somthing, как (в Судо XML-доброму)

<return> 
    <id>1</id> 
    <name>Bournemouth</name> 
    <students> 
    <student> 
    </student> 
    </students> 
</return> 

любые справочные советы или указатели будут greatfuly RECIVED Благодарности

------- -------------------- Дополнительная информация ---------------------------- -

так я выполнил регистрацию SQL, как Паскаль любезно предложил, который при вызове метода genorates

SELECT DISTINCT t1.ID, t1.NAME, t0.ID, t0.NAME, t0.college_Id FROM STUDENT t0, COLLEGE t1 WHERE (t0.college_Id = t1.ID) 

Я также протестировал вышеуказанный скрипт в своей БД, и его результаты были такими, как я ожидал бы, что JPA вернется.

ID name    id  name  col_id 
1 "Bournemouth 2 James 1 
1 "Bournemouth 3 Rich 1 
1 "Bournemouth 1 Jon 1 
1 "Bournemouth 4 tom 1 

, так что я думаю, это означает, что в моей установке JPA должна быть проблема? , так как его явно не переупаковывают результаты правильно.

Еще раз спасибо

----------- Update --------------------------- В дополнение к предложениям Pascals я распечатал данные в журнале сервера, чтобы вырезать интерфейс Tester .

public List<College> getCollageWithStudents(){ 
    List<College> s = null; 
    try{ 
     Query query = em.createNamedQuery(College.collegeStudentBasicJoinQuery); 
     s = query.getResultList(); 

     for (int i = 0; i < s.size(); i++) { 
       College c = (College) s.get(i); 
       System.out.println("College "+c.getId() + " "+c.getName()); 
       System.out.println("Amt Students: "+c.getStudents().size()); 
       for (int j = 0; j < c.getStudents().size(); j++) { 
        Student stu = (Student) c.getStudents().get(j); 
        System.out.println(stu.getId() + " "+stu.getName()); 
       } 
      } 
    }catch (Exception e) { 
     System.out.println(e.toString()); 
    } 
    return s; 
} 

Результат такой, какой должен быть, но это все еще не отражено в интерфейсе Glassfish.

INFO: College 1 "Bournemouth 
INFO: Amt Students: 4 
INFO: 2 James 
INFO: 3 Rich 
INFO: 1 Jon 
INFO: 4 tom 

ответ

1

Ваш текущий запрос делает INNER JOIN и, таким образом, возвращает строки, когда в обеих таблицах имеется хотя бы одно совпадение. Другими словами, вы получите College каждого Student, который имеет College (и это объясняет, почему вы получаете 4 раза Bournemouth здесь).

насчет:

SELECT DISTINCT c 
FROM College c JOIN FETCH c.students 

Это будет возвращать отчетливые College, имеющий Studentпринести ассоциацию).

+0

Спасибо за ответ Паскаль, у меня есть treid выше, это только швы, которые завершают часть Коллегии запроса, другими словами, ее не делают, чтобы получить часть. – Jon

+0

@ Jon Я предлагаю активировать ведение журнала SQL, чтобы увидеть, что происходит точно, но я на 100% уверен, что этот запрос тоже забирает студентов (т. Е. Вы получаете Колледж со своими учениками, загруженными). –

+0

@Pascal Я добавил sql logging с моими результатами, добавленными к вышеуказанному запросу. Спасибо – Jon

Смежные вопросы