I have 2 tables event_history and event_marks. event_marks table having foreign key reference with event_marks.event_history_id to event_history.id.Baiscally an event_history can have many event_marks(one to many relationship). I need to get all event_history records that have the last event_mark with category as a specific string. Currently i have a BooleanBuilder query that selects all the records using a “in” query.
public static BooleanBuilder filterProcessor(@Valid Optional<String> mark, @Valid Optional<String> type) {
type.ifPresent(enumValue -> FilterUtils.enumValidator(EventType.class, enumValue));
mark.ifPresent(enumValue -> FilterUtils.enumValidator(EventMarkType.class, enumValue));
BooleanBuilder booleanBuilder = new BooleanBuilder();
type.ifPresent(et -> booleanBuilder.and(eventHistoryEntity.type.in(Arrays.asList(et.split(",")))));
mark.ifPresent(ct -> {
List<String> markFilter = new ArrayList<>(Arrays.asList(ct.split(",")));
if (!markFilter.isEmpty()) {
booleanBuilder
//The below query selects eventHistory records having a specific markFilter in any eventMark
.**and(eventHistoryEntity.eventMarks.any().category.in(markFilter)**
.or(eventHistoryEntity.eventMarks.isEmpty()));
} else {
booleanBuilder.and(eventHistoryEntity.eventMarks.isEmpty());
}
});
As highlighted above i need to modify this query to check on last eventMark to have a specific category instead of any eventMark with a specific category. It will be some thing like below
booleanBuilder.and(eventHistoryEntity.eventMarks.get(eventHistoryEntity.eventMarks.size().subtract(1)).category.eq(
markFilter.get(0)));
Also tried with bolow
booleanBuilder.and(eventHistoryEntity.eventMarks.any().category.in(markFilter)
.and(eventHistoryEntity.eventMarks.any().createdTime.eq(JPAExpressions.select(
eventMarkEntity.createdTime.max()) .from(eventMarkEntity) .where(eventMarkEntity.eventHistoryId.eq( eventHistoryEntity.id)))));
Nothing is working. I am quite new to Querydsl and BooleanBuilder. Any help would be highly appreciated