Сложный запрос трех таблиц возвращает неверные строки - PullRequest
0 голосов
/ 04 июня 2019

Я хочу получить только те элементы, которые имеют соответствующую вспомогательную конфигурацию. Я разрабатывал метод запроса вместе с тестами JUnit. Окончательный запрос будет более сложным, включая другую таблицу, но сначала нужно решить эту проблему. задание должно содержать хотя бы одно видео или одну викторину и может иметь несколько каждого. Мне нужно игнорировать те, которые не имеют либо.

Я реализовал простой запрос getListA() и запросы, которые проверяют тест getListB() или видео getListC(). Они возвращают 3, 1 и 1 предмет, как и ожидалось.

Запросы:

public List<AssignEntity> getListA(Integer orgid)
{
    Query query = entityManager.createQuery(
        "SELECT asgn FROM AssignEntity asgn, SegmentEntity asege " + 
        "WHERE asgn.orgid = :org AND asgn.id = asege.assignid");
    query.setParameter("org", orgid);
    return query.getResultList();
}

public List<AssignEntity> getListB(Integer orgid)
{
    Query query = entityManager.createQuery(
        "SELECT asgn FROM AssignEntity asgn, SegmentEntity asege " + 
        "WHERE asgn.orgid = :org AND asgn.id = asege.assignid " + 
        "AND asege.quizid IS NOT NULL");
    query.setParameter("org", orgid);
    return query.getResultList();
}

public List<AssignEntity> getListC(Integer orgid)
{
    Query query = entityManager.createQuery(
        "SELECT asgn FROM AssignEntity asgn, SegmentEntity asege, ContentEntity cie " + 
        "WHERE asgn.orgid = :org AND asgn.id = asege.assignid " + 
        "AND asege.contentid = cie.id AND cie.typeid = :videoct");
    query.setParameter("org", orgid);
    return query.getResultList();
}

public List<AssignEntity> getListD(Integer orgid)
{
    Query query = entityManager.createQuery(
        "SELECT asgn FROM AssignEntity asgn, SegmentEntity asege, ContentEntity cie " + 
        "WHERE asgn.orgid = :org AND asgn.id = asege.assignid " + 
        "AND ((asege.quizid IS NOT NULL) OR (asege.contentid = cie.id AND cie.typeid = :videoct))");
    query.setParameter("org", orgid);
    return query.getResultList();
}

Сущности. Геттеры и сеттеры были удалены.

@Entity
@Table(name="assignments")
public class EntityAssignEntity implements Serializable
{
    @Id
    @GeneratedValue()
    private Integer id;

    private Integer orgid;
    private String name;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "assignmentid")
    private List<SegmentEntity> assignmentSegments;
}

@Entity
@Table(name="assignment_sequences")
public class EntityAssignmentSequencesModel implements Serializable
{
    @Id
    @GeneratedValue()
    private Integer Id;

    private Integer assignmentid;
    private Integer contentid;
    private Integer quizid;
    private Integer segmentnum;

    @ManyToOne
    @JoinColumn(name = "assignmentid", referencedColumnName = "id", insertable = false, updatable = false)
    private AssignEntity assignment;

    @ManyToOne
    @JoinColumn(name = "contentid", referencedColumnName = "id", insertable = false, updatable = false)
    private ContentEntity contentItem;
}

@Entity
@Table(name="content_items")
public class ContentEntity implements Serializable
{
    public enum ContentTypes
    {
        NONE, // should be 0 
        VIDEO, EXAM, OTHER;
    }

    @Id
    @GeneratedValue()
    private Integer id;

    private String name;

    @Enumerated(EnumType.ORDINAL)
    private ContentTypes typeid;
}

Нет ошибок. Сложный запрос getListD() возвращает 17 элементов, когда он должен вернуть 1. У меня есть другой запрос, идентичный getListD(), за исключением того, что он выбирает cie. Он также возвращает 17 элементов, многие из которых даже не соответствуют параметру orgid. Похоже, что запрос получает неправильный приоритет, рассматривая его как WHERE (A AND B AND C AND D) OR (E AND F).
Есть предложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...