繁体   English   中英

在子查询中使用 Blaze Persistence 可选参数

[英]Using Blaze Persistence optional parameter in subquery

在 Blaze Persistence 中,有没有办法在子查询中使用可选参数?

在我当前的用例中,假设我有主题、用户和名为topic_last_seen的第三个表,用于记录每个用户上次阅读每个主题的日期。 我想为Topic实体创建一个实体视图,该视图还将每个主题的日期映射到当前用户作为“可选参数”给出。 这大致是我一直在尝试的:

@EntityView(Topic.class)
public interface TopicView
{
    @IdMapping
    Long getId();

    String getSummary();

    @MappingParameter("currentUserId")
    Long getCurrentUserId();

    @MappingSubquery(LastSeenDateSubqueryProvider.class)
    Date getLastSeenDate();

    class LastSeenDateSubqueryProvider implements SubqueryProvider
    {
        @Override
        public <T> T createSubquery(SubqueryInitiator<T> subqueryBuilder)
        {
            return subqueryBuilder.from(TopicLastSeen.class, "lastSeen")
                    .select("dateSeen")
                    .where("lastSeen.user.id").eqExpression("EMBEDDING_VIEW(currentUserId)")
                    .where("lastSeen.topic.id").eqExpression("EMBEDDING_VIEW(id)")
                    .end();
        }
    }
}

不幸的是,这会导致异常:

java.lang.IllegalArgumentException: Attribute 'currentUserId' not found on type 'Topic'

有没有办法在这样的子查询中使用可选参数? 或者是否有不同的方式来映射这些信息? 此时更改数据库架构不是一个选项。

看起来我通过反复试验找到了一个可能的解决方案。 EntityViewSetting中的“可选参数” EntityViewSetting可以像 JPQL 中的常规参数一样使用:

return subqueryBuilder.from(TopicLastSeen.class, "lastSeen")
        .select("dateSeen")
        .where("lastSeen.user.id").eqExpression(":currentUserId")
        .where("lastSeen.topic.id").eqExpression("EMBEDDING_VIEW(id)")
        .end();

不幸的是,通过这个子查询映射,currentUserId 参数不再是“可选的”。 当它没有设置时,我会得到另一个异常:

org.hibernate.QueryException: Named parameter not bound : currentUserId 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM