2016-03-10 2 views
1

У меня есть следующие 2 класса с использованием типа транзакции JTA с openjpa & a derby embedded db. Я хочу получить родительскую организацию & запрашиваемого WSpace в одном запросе, когда у меня есть только идентификатор WSpace. Я довольно новичок в JPA, поэтому изучаю, когда я ухожу, и боролся с запросом «q2». Я использовал запросы «q0» & «q1» для отладки и проверки элементов в db. 'q0' возвращает 1 объект так же, как и 'q1', тогда как 'q2' возвращает 0 объектовjpa query join fetch from onetomany

Я пробовал различные настройки объектов и разные запросы, но пока ничего не получилось.

Ориентировочно у класса WSpace не было поля Organization, поскольку оно не казалось необходимым для сохранения или выбора, но я добавил его (вместе с параметром mappedby), чтобы он был необходим для работы запроса, но ничего не было изменилось.

обратно к первоначальному вопросу, как я могу получить эту работу, так что возвращает родительский объект с единственным ребенком запрашиваемых

SELECT o FROM Organisation o JOIN FETCH o.spaces w WHERE w.id = :id 

Вот мои классы

@Entity 
public class Organisation implements MyObjects 
{ 
    @Id 
    @NotNull 
    private Integer id; 
    private String name; 
    @OneToMany(mappedBy = "organisation", 
     cascade = { CascadeType.PERSIST, CascadeType.MERGE }) 
    private List<WSpace> spaces; 

    //getters/setter below 
} 

And 

@Entity 
public class WSpace implements MyObjects 
{ 
    @Id 
    @NotNull 
    private Integer id; 
    private String name; 
    @ManyToOne 
    private Organisation organisation; 
    @OneToMany 
    private List<Application> apps; 

    //getters/setter below 
} 

class DAO 
{ 
    ... 

    public void foo(Integer id) 
    { 
     .... 
     String q0 = "SELECT o FROM Organisation o WHERE o.id = 49068"; 
     List<Organisation> res0 = em.createQuery(q0, Organisation.class).getResultList(); 
     String q1 = "SELECT w FROM WSpace w WHERE w.id = " + id; 
     List<WSpace> res1 = em.createQuery(q1, WSpace.class).getResultList(); 
     String q2 = "SELECT o FROM Organisation o " 
       + "JOIN FETCH o.spaces w WHERE w.id = " + id; 
     List<Organisation> res2 = em.createQuery(q2, Organisation.class).getResultList(); 
     ... 
    } 
} 
+0

Использовать @JoinColumn ("column_name") в @ManyToOne –

+0

не имеет значения, я также попытался удалить повторный рефери ManyToOne и использовал JoinTable, который все еще возвращает 0. Я начинаю подозревать, что это не возможно – APW

+0

пока я просто собираюсь сохранить обратную ссылку ManyToOne и вызывать 'SELECT w FROM WSpace w WHERE w.id =: id', чтобы получить Организацию из WSpace. – APW

ответ

0

Вы пробовали посмотреть в журналах для вывода вашего q2-запроса? Я тоже изучаю JPA и занимаюсь вопросами Критерии и QL совсем недавно. Итак, после того, как у меня были проблемы с присоединением, я начал проверять журналы, и было довольно ясно, каковы были проблемы, так как журналы отображались на SQL-запросы. Другое дело, как вы создаете свои сущности? Я использовал Netbeans для его создания. Кроме того, многие из многих отношений mignt тоже имеют класс-помощник, я видел его в одном из проектов. Надеюсь, что это помогает ..

+0

где хранятся журналы? ничто не подталкивается к командной строке? – APW

+0

В моем случае у меня были тесты Unit для всех моих CRUD-методов, поэтому SQL-запросы, выпущенные JPA, были выведены на консоль (если я не ошибаюсь или в журнал сервера Glassfish). В вашем случае вы можете взглянуть на это сообщение http://stackoverflow.com/a/4367283 или этот http://stackoverflow.com/a/5129495 для входа в окно вывода IDE – Mykola

0

Запрос вы ищете, вероятно, это:

SELECT w FROM WSpace w LEFT JOIN FETCH w.organisation where w.id=:id 

с query.setParameter("id", id);, чтобы связать параметр идентификатора запроса. Это фактически говорит поставщику сохранения, чтобы получить отношение WSpace.organisation во время запроса для объектов WSpace в том же запросе. Используя LEFT [OUTER] keword (OUTER, являющийся необязательным) перед JOIN FETCH ключевыми словами, вы указываете своему поставщику персистентности выбрать WSpace объектов, даже если нет соответствующих Organisation записей для вашего WSpace.organisation отношений.