Ошибка при вызове запроса CMIS, если строка содержит одинарную или двойную кавычку

Вот моя проблема: когда я пытаюсь передать строку запроса в CMIS Query, которая содержит одинарные или двойные кавычки, она не выполняется и выдает ошибку, как показано ниже:

06:19:23,306 ERROR [DispatcherPortlet:561] Could not complete request
org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException: Internal Server Error
at org.apache.chemistry.opencmis.client.bindings.spi.atompub.AbstractAtomPubService.convertStatusCode(AbstractAtomPubService.java:506)
at org.apache.chemistry.opencmis.client.bindings.spi.atompub.AbstractAtomPubService.post(AbstractAtomPubService.java:661)
at org.apache.chemistry.opencmis.client.bindings.spi.atompub.DiscoveryServiceImpl.query(DiscoveryServiceImpl.java:179)
at org.apache.chemistry.opencmis.client.runtime.SessionImpl$6.fetchPage(SessionImpl.java:935)
at org.apache.chemistry.opencmis.client.runtime.util.AbstractIterator.getCurrentPage(AbstractIterator.java:132)
at org.apache.chemistry.opencmis.client.runtime.util.AbstractIterator.getPageNumItems(AbstractIterator.java:57)
at org.apache.chemistry.opencmis.client.runtime.util.AbstractIterable.getPageNumItems(AbstractIterable.java:86)
at com.zeetv.util.UtilMethods.getQueryResults(UtilMethods.java:349)
at com.zeetv.action.twitter.TwitterController.checkTitle(TwitterController.java:121)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175)
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:369)
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter.doHandle(AnnotationMethodHandlerAdapter.java:356)
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter.handleResource(AnnotationMethodHandlerAdapter.java:302)
at org.springframework.web.portlet.DispatcherPortlet.doResourceService(DispatcherPortlet.java:859)
at org.springframework.web.portlet.FrameworkPortlet.processRequest(FrameworkPortlet.java:527)
at org.springframework.web.portlet.FrameworkPortlet.serveResource(FrameworkPortlet.java:479)

Вот моя строка запроса:

select * from my:content where cmis:name Like 'test's new content1'

Я также пробовал так:

select * from my:content where cmis:name Like '"test's new content1"'

Заранее спасибо.


person User14141111    schedule 22.01.2016    source источник
comment
Вы можете использовать класс OpenCMIS QueryStatement (chemistry.apache.org/java/0.13.0/maven/apidocs/org/apache/). Он делает все побег за вас.   -  person Florian Müller    schedule 22.01.2016
comment
Как вы пометите это с помощью Liferay: связано ли это с хранилищем Liferay CMIS или с запросом, который вы сами выполняете в отношении Alfresco, который просто находится в приложении Liferay?   -  person Olaf Kock    schedule 22.01.2016
comment
@OlafKock да, я звоню на свежем воздухе из Liferay.   -  person User14141111    schedule 22.01.2016
comment
@FlorianMüller спасибо за помощь. Он работал с QueryStatement. :)   -  person User14141111    schedule 22.01.2016


Ответы (1)


Пожалуйста, просмотрите это:

Строковые литералы заключаются в одинарные кавычки. Экранирование не следует за экранированием SQL-92. Две одинарные кавычки в строковом литерале не представляют символ кавычки: '''' не является литералом одинарной кавычки.

CMIS определяет экранирование на основе обратной косой черты с доступными escape-символами, определяемыми контекстом.

'bob\'s' is used in place of 'bob''s'

SELECT * from cmis:document WHERE cmis:name = 'bob\'s'

Базовый побег:

  • \\ represents \
  • \' represents '

...

person Younes Regaieg    schedule 22.01.2016