用户能不能定义自己的QueryMacroHandler?

我想自己定义QueryMacroHandler,能否提供一下实现方式?

这个想法不错,我看了一下平台的实现,其实很简单,

  1. 定义自己的MacroHandler,要将其定义为Spring Bean,并且 scope 是 prototype。可以直接实现接口 QueryMacroHandler,也可以继承 AbstractQueryMacroHandler 。直接实现接口 QueryMacroHandler 的话你要实现一个字符匹配的方法,继承 AbstractQueryMacroHandler 的话可以直接定义字符匹配的正则。
  2. 确保自定义的 MacroHandler 类在Spring 的Bean 扫描范围。
    这样就可以了,你可能参考一下平台实现的几个 MacroHandler:
    DateEqualsMacroHandler 、TimeBetweenQueryMacroHandler 等。

我是按你说的办法扩展的,但是不能使用,查看了一下代码,好像平台自己扩展的几个都在antlr有定义,我自己的就没发正确解析,不知道有没有办法?
官方在com.haulmont.cuba.core.sys.jpql.antlr2包下,我自己的不知道怎么写了

你看的平台是哪个版本的 ?

版本是:7.1的

ANTLR2 包下的是CUBA 平台实现的JPQL 语法解析器。简单地实现查询宏(macro) 处理器不需要ANTLR。方便的话把你的实现贴出来我们看看。

我仿照DateEquals写了一个EntityQueryMacroHandler,就改了下pattern
@Component(“lims_EntityQueryMacroHandler”)
@Scope(“prototype”)
public class EntityMacroHandler extends AbstractQueryMacroHandler {

protected static final Pattern MACRO_PATTERN = Pattern.compile("@entity\\s*\\(([^)]+)\\)");

protected Map<String, Object> namedParameters;

where设置为:@entity({E}.createTs, now-1)
测试发现,运行到com.haulmont.cuba.core.sys.jpql.transform.QueryTransformerAstBased 252行
Parser.parseWhereClause就出错了
com.haulmont.cuba.core.sys.jpql.JPA2RecognitionException: line 1:9 mismatched character ‘T’ expecting ‘U’

是JPA2Parser抛出来的,所以猜测和ANTLR有关

我是想扩展Filter,使得用户选择一个实体后,参与查询条件的的实际字段不是实体本身而是实体的一个属性,因为customCondition只能使用?来代表实体本身,所以想找个办法扩展一下。

我看了一下,确实在语法解析器中加入了几个内置的宏语法。所以自定义MacroHandler 是比较困难了,还是考虑其它方式实现你的需求吧。

不太明白你现在的问题,能举例描述一下吗。

11个帖子被分离到新主题过滤器的实体间关联查询问题