JPA EntityGraph DISTINCT с параметром приводит к декартовому произведению - PullRequest
0 голосов
/ 28 января 2019

2 У меня есть сущность с 4 1: n отношениями

@Entity
@Table(name="REPORT_MESSAGE")
@NamedEntityGraph(name=ReportMessage.GRAPH_ALL, attributeNodes= {@NamedAttributeNode("reportEvents"), @NamedAttributeNode("reportLabels"), @NamedAttributeNode("reportReceivers"), @NamedAttributeNode("reportSenders")})
public class ReportMessage implements Serializable {

    @Id
    @Column(name="REPORT_MESSAGE_ID")
    private Long reportMessageId;

    //bi-directional many-to-one association to ReportEvent
    @OneToMany(mappedBy="reportMessage")
    private List<ReportEvent> reportEvents;

    //bi-directional many-to-one association to ReportLabel
    @OneToMany(mappedBy="reportMessage")
    private Set<ReportLabel> reportLabels;

    //bi-directional many-to-one association to ReportReceiver
    @OneToMany(mappedBy="reportMessage")
    private Set<ReportReceiver> reportReceivers;

    //bi-directional many-to-one association to ReportSender
    @OneToMany(mappedBy="reportMessage")
    private Set<ReportSender> reportSenders;

Я хочу использовать граф сущностей для быстрого извлечения

@Override
public List<ReportMessage> findAllEagerly() {
    EntityGraph<?> graph = em.createEntityGraph(ReportMessage.GRAPH_ALL);
    List<ReportMessage> reportMessages = em.createQuery("SELECT DISTINCT r FROM ReportMessage r")
            .setHint("javax.persistence.loadgraph", graph)
            .getResultList();
    return reportMessages;
}

этот метод работает как ожидалось: у меня есть8 записей в БД, и он возвращает 8 ReportMessage. Однако, когда я добавляю в запрос paremeter, я получаю декартово произведение:

@Override
public List<ReportMessage> findForMessagidEagerly(String messageid) {
    EntityGraph<?> graph = em.createEntityGraph(ReportMessage.GRAPH_ALL);
    Query query = em.createQuery("SELECT DISTINCT r  FROM ReportMessage r WHERE r.messageid=:messageid")
            .setHint("javax.persistence.loadgraph", graph);
    query.setParameter(ReportMessage.PARAM_MSG_ID, messageid);
    List<ReportMessage> messages = query.getResultList();

    return messages;
    }

Я ожидаю получить 1 ReportMessage, но получить 84. С именованным запросомЯ получаю тот же результат.Что происходит?

1 Ответ

0 голосов
/ 29 января 2019

Проблема была вызвана двунаправленными отношениями.После перехода к однонаправленным отношениям код работает как ожидалось.Однако кто-нибудь знает, есть ли у меня ошибка в моем исходном коде, или это спящий режим или он не указан в JPA?

...