在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