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



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

在我当前的用例中,假设我有主题、用户和第三个名为topic_last_seen的表,记录每个用户最后一次阅读每个主题的日期。我想为CCD_ 2实体创建一个实体视图,它还映射每个主题的日期;可选参数";。这大致就是我一直在尝试的:

@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'

有没有办法在这样的子查询中使用可选参数?或者有不同的方法来映射这些信息吗?在这一点上,更改DB架构不是一个选项。

看起来我通过反复试验找到了一个可能的解决方案。似乎";可选参数";来自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 

最新更新