I want to filter a query based on the contents of a list on the entity. I do not simply want to check if something is in this list, I want to have a ‘predicate’ as in functional programming, It’s been challenging to research since ‘predicate’ is something else in hql.
so basically
JavaScript
x
list.filter(x -> x > 100 and x < 150)
Is what I want in my hql.
JavaScript
// This query is pseudocode of what I want to achieve
// keywords ANY_OF, CONFORMS_TO are made up syntax in the code below
public List<PainTracker> getTrackersInCurrentlyActive() {
String query = "FROM PainTracker AS tracker WHERE ANY_OF tracker.timePeriods AS tp CONFORMS_TO tp.startTime < :currentTime AND tp.endTime > :currentTime)";
TypedQuery<ParkedParking> q = entityManager.createQuery(query, ParkedParking.class);
q.setParameter("currentTime", new Date());
return q.getResultList();
}
//PainTracker has this field
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "pain_time_periods",
joinColumns = @JoinColumn(name = "pain_tracker"),
inverseJoinColumns = @JoinColumn(name = "time_periods"))
private List<TimePeriod> timePeriods;
@Entity
@Table(name = "time_period")
public class TimePeriod {
// This table have startTime and endTime
I’ve looked at using expression operator ANY (subquery) but I don’t see how it gets all the way there. I need to have my entire expression as a check against each item in the list.
Does HQL have something for this, what is it called?
Advertisement
Answer
Try to use the following query:
JavaScript
select distinct p from PainTracker p
join fetch p.timePeriods tp
where tp.startTime < :currentTime and tp.endTime > :currentTime
See also this section of the hibernate documentation.