我正在将JPA和Olingo用于某些REST服务。我可以使用与我的实体类似的示例进行基本实现:JPA Olingo Web App

但是,现在我试图在加入访问表的地方添加授权,然后相应地过滤结果。我只是想知道是否有一种不必重写默认行为的好方法。我在Annotation Processor处已经看到用于EDM的注释处理器,但是它似乎不太适合我们的模型。

我的问题是:是否有一种简单的方法可以将Olingo JPA Processor更改为默认情况下联接表和过滤器实体以实现授权?这将要求我能够传递帐户进行过滤并限制所有结果。

我还尝试了此处所述的预处理和后处理。 Custom JPA Processor然而,由于JPA查询将返回太多结果,并且转换成千上万的对象很长且成本很高,因此需要在查询中进行过滤,而不要在返回结果之后进行。

到目前为止,我已经实现了CustomODataJPAProcessor。但是,这将要求我现在重写并重写org.apache.olingo.odata2.jpa.processor.core.access.data.JPAProcessorImpl#processmethod并使用所需的功能修改JPA查询。您会看到我实现了一个新的JPAProcessor,在其中调用process并发送我的帐户。这是我的代码在CustomODataJPAProcessor的readEntitySet方法中的样子:

    /* Pre Process Step */
    preprocess( );
    List<String> accounts = new ArrayList<>();

    //This is what the original readEntitySet does
    //ODataJPAFactory.createFactory().getODataJPAAccessFactory().getODataJPAResponseBuilder(oDataJPAContext);

    //Using custom JPA Processor that I added
    jpaProcessor = new CustomJPAProcessor(this.oDataJPAContext);
    CustomJPAProcessor customJPAProcessor = (CustomJPAProcessor)jpaProcessor;
    List<Object> jpaEntities = customJPAProcessor.process(uriParserResultView, accounts);

    //What the docs want you to do http://olingo.apache.org/doc/odata2/tutorials/CustomODataJPAProcessor.html
    //java.util.List<Object> jpaEntities = jpaProcessor.process(uriParserResultView);

   /* Post Process Step */
    postProcess( );

最佳答案

我不知道您是否还在为此工作。
我正在解决这个问题。
Olingo提供了ODataJPAQueryExtensionEntityListener,此侦听器是在执行buildQuery之前由JPAQueryBuilder执行的。

使用此无状态侦听器,您可以替换buildQuery方法,以便可以访问和更改包含JPQL查询的字符串jpqlStatement.toString()。

我认为比原生SQL更好

再见
多梅尼科

10-07 20:15