[英]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.