Как сделать запрос с 3 компонентами ManyToOne?

Я получил базу данных с результатом таблицы, это выглядит так:

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

resultId, resultValue, patientId (его внешний ключ таблицы Patient), scriptId (внешний ключ ScriptMW), userId (внешний ключ пользователя)

и я забыл, что пользователь таблицы имеет также внешний ключ в нем, от 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"])

есть идеи?

1 ответ

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

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

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

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

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