2016-12-29 1 views
0

я получил базу данных таблицы результатов, это выглядит следующим образом:Как сделать запрос с 3 компонентами ManyToOne?

Таблица Результат:

resultId, resultValue, patientId (its a Foreign key of the table Patient), scriptId(Foreign key of ScriptMW), userId(Foreign key of User)

и я забыл пользователь таблицы имеет также внешний ключ в нем, от patientId так 1 пользователь имеет больше пациентов .... его OneToMany аннотации там все они являются целыми числами

Вот как это выглядит, и в моем Java коде я получил это:

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Integer resultId; 

@ManyToOne 
private User user; 

@ManyToOne 
private ScriptMW scriptMW; 

@ManyToOne 
private Patient patient; 

@Lob 
@Column(length=65536) 
private String resultValue; 

Так вы можете увидеть его 3 раза в ManyToOne аннотацию

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

Я получил userId, ScriptId и patientId как параметры пути, и это работает ... но теперь мне нужно получить все значения ... и я не знаю, как это сделать ... посмотрите на код ниже

я не могу даже выбрать что-нибудь из результата

@Override 
public List<Result> getResults(Integer userId, Integer scriptId, Integer patientId) { 

    Query q=em.createQuery("Select r From Result r"); 
    return q.getResultList(); 

} 

После того, как я сделать предыдущий код я получаю эту ошибку:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: entities.User.patients, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->entities.Result["user"]->entities.User["patients"]) 

любые идеи?

+0

Вы можете уточнить, какой из ваших вопросов связан с 'jquery' ..? –

ответ

0

Я нашел ответ, проблема была с пользователем

@OneToMany(cascade={CascadeType.ALL}) 
private Set<Patient> patients; 

Он был ленивым (по умолчанию), но должен был быть EAGER

@OneToMany(fetch = FetchType.EAGER, cascade={CascadeType.ALL}) 
private Set<Patient> patients; 

После того, как я добавил его, я использовал следующие запрос и он работал все ...

Query q=em.createQuery("Select r From Result r where r.user.userId=:userId and r.scriptMW.scriptId=:scriptId and r.patient.patientId=:patientId") 
      .setParameter("userId", userId).setParameter("scriptId", scriptId).setParameter("patientId", patientId); 

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

+0

Вы также можете передавать объекты как параметры, таким образом ваш запрос не должен знать внутренности всех этих классов. И это набор пациентов в User? Как они соединяются с пациентом в результате? – Deltharis

+0

Как я могу передать сущности там? И да, в пользователе есть набор пациентов, и в результате есть аннотация @ManyToOne с пациентом, всего один пациент за результат. – newbie

+0

'Пользовательский пользователь, ...' в параметрах метода, 'Выберите r Из результата r, где r.user =: user' в запросе и' .setParameter («пользователь», пользователь) '. И у вас есть единственный пациент в Резултате, да, но в результате. У пациентов больше много для какого-то резонанса? Это имеет смысл в вашем случае использования? – Deltharis