Java 有没有办法解析jooq中的自定义函数?

Java 有没有办法解析jooq中的自定义函数?,java,sql,parsing,jooq,Java,Sql,Parsing,Jooq,我想在一种方言上解析我的函数,然后将它转换成另一种方言 例如,我在一种方言中有这样的字符串: "(1 + my_function(myTable.id*2))/2" 我想将它解析并呈现为另一种方言,就像这样: "(1 + my_other_dialect_function(myTable.id*2))/2" 我已经创建了CustomFieldinheritor,它将使用以下方法正确呈现: 类MyFunctionCustomField扩展了CustomField 但我无法找到将其插入表达式的

我想在一种方言上解析我的函数,然后将它转换成另一种方言

例如,我在一种方言中有这样的字符串:

"(1 + my_function(myTable.id*2))/2"
我想将它解析并呈现为另一种方言,就像这样:

"(1 + my_other_dialect_function(myTable.id*2))/2"
我已经创建了
CustomField
inheritor,它将使用以下方法正确呈现:

类MyFunctionCustomField扩展了CustomField
但我无法找到将其插入表达式的正确方法

我可以在解析步骤中这样做吗?或者在渲染步骤中使用VisitListener,如下所示

public class CustomFunctionsFisitListener2 extends DefaultVisitListener {
  public void visitStart(VisitContext context){
    if(context.queryPart().isTheFunctionINeed()){
      Field<?> argument = context.queryPart().retrieveArgumentExpression();
      context.queryPart(MyFunctionCustomFiled(argument));
    }
  }
}
public类CustomFunctionsFisitListener2扩展了DefaultVisitListener{
public void visitStart(VisitContext上下文){
if(context.queryPart().IstheFunctionined()){
字段参数=context.queryPart().retrieveArgumentExpression();
queryPart(myfunctioncustomfield(参数));
}
}
}
从jOOQ 3.12版(以及即将推出的3.13版)开始,您无法通过访问jOOQ表达式树的方式,让您的
VisitListener
确保对输入函数的每次调用都可以被对输出函数的调用所取代

重新设计当前的内部对象模型,使其成为公共API,主要是为了实现您正试图使用jOOQ for:作为解析器来转换SQL表达式树的确切目的。这是一个很大的工作,因为我们必须整合真正相同事物的各种内部表示:例如,用户定义的函数。正如您在评论中所注意到的,这目前是一个
org.jooq.impl.Function
,但目前还不能保证函数可以用该类型表示

您现在可以做的一件事是使用模式来限定您的函数,并使用现成的运行时模式映射功能:


对于您的特定问题,目前最实用的解决方案可能是在将函数名传递给解析器之前使用regex替换函数名,因为我假设函数名在您的系统中应该足够唯一。

这与您链接的页面上“实现供应商特定函数的示例”部分中给出的示例是否相似?我是否正确地理解了方言X中有一些特定的功能,但想以某种方式将其用于方言Y?是的,但要以更复杂的方式。我不会直接创建那些jooq字段。我用这个。我有一个sql字符串,它的函数是方言X。我想解析这个字符串,然后将它转换成方言Y。问题是解析器默认为我的函数创建org.jooq.impl.function实现。我想用MyFunctionCustomField实现替换它,以便它能够正确地呈现。我只是不知道如何在解析步骤和呈现步骤上都做到这一点。好奇:您主要是将解析器用于此类SQL转换任务,还是也用于其他用例?
public class CustomFunctionsFisitListener2 extends DefaultVisitListener {
  public void visitStart(VisitContext context){
    if(context.queryPart().isTheFunctionINeed()){
      Field<?> argument = context.queryPart().retrieveArgumentExpression();
      context.queryPart(MyFunctionCustomFiled(argument));
    }
  }
}