Я хочу получить только те элементы, которые имеют соответствующую вспомогательную конфигурацию. Я разрабатывал метод запроса вместе с тестами 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)
.
Есть предложения?