【问题标题】:HQL query checking each item of list against multiple requirementsHQL 查询根据多个要求检查列表的每个项目
【发布时间】:2021-10-29 22:13:04
【问题描述】:

我想根据实体上的列表内容过滤查询。我不只是想检查此列表中是否有某些东西,我想像函数式编程一样有一个“谓词”,因为“谓词”在 hql 中是其他东西,所以研究起来很有挑战性。

基本上是这样

list.filter(x -> x > 100 and x < 150)

这是我在我的 hql 中想要的。

// 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

我看过使用expression operator ANY (subquery),但我不知道它是如何到达那里的。我需要用我的整个表达式来检查列表中的每个项目。

HQL 有这方面的东西吗,叫什么?

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    尝试使用以下查询:

    select distinct p from PainTracker p
    join fetch p.timePeriods tp
    where tp.startTime < :currentTime and tp.endTime > :currentTime
    

    另请参阅休眠文档的this section

    【讨论】:

    • 嗯,我已经启动并运行了类似的东西。但我认为它对我的用例失败了:问题中没有说明,但我也有一个 where 语句,基本上是“WHERE p.timePeriods 为空或 ”,我怀疑发生了什么'is empty' 永远不可能与那个 join fetch 写的查询相符?
    • 是的,但是您可以在这种情况下使用left join fetch
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2012-03-13
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    相关资源
    最近更新 更多