Transient поле в jpql запросе

Доброго вечера.

Создал неперсистентное поле:

    @Transient
    @MetaProperty
    protected Integer currentRunlife;

    public Integer getCurrentRunlife() {
        return currentRunlife;
    }
    public void setCurrentRunlife(Integer currentRunlife) {
        this.currentRunlife = currentRunlife;
    }

Но в запросе jpql его получить не могу.

Сведения
java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Problem compiling [select e.currentRunlife from wedb$ActivityInstall e]. 
[7, 23] The state field path 'e.currentRunlife' cannot be resolved to a valid type.
	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1620)
	at com.haulmont.cuba.core.sys.QueryImpl.buildJPAQuery(QueryImpl.java:212)
	at com.haulmont.cuba.core.sys.QueryImpl.getQuery(QueryImpl.java:127)
	at com.haulmont.cuba.core.sys.QueryImpl.getResultList(QueryImpl.java:357)
	at com.haulmont.cuba.core.jmx.PersistenceManager.jpqlLoadList(PersistenceManager.java:193)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:84)
	at com.haulmont.cuba.security.sys.AuthenticationInterceptor.aroundInvoke(AuthenticationInterceptor.java:41)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:627)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:616)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:84)
	at com.haulmont.cuba.core.sys.MBeanInterceptor.aroundInvoke(MBeanInterceptor.java:39)
	at sun.reflect.GeneratedMethodAccessor257.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:627)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:616)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
	at com.sun.proxy.$Proxy277.jpqlLoadList(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
	at sun.reflect.GeneratedMethodAccessor64.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
	at javax.management.modelmbean.RequiredModelMBean$4.run(RequiredModelMBean.java:1252)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
	at javax.management.modelmbean.RequiredModelMBean.invokeMethod(RequiredModelMBean.java:1246)
	at javax.management.modelmbean.RequiredModelMBean.invoke(RequiredModelMBean.java:1085)
	at org.springframework.jmx.export.SpringModelMBean.invoke(SpringModelMBean.java:90)
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
	at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
	at com.haulmont.cuba.web.jmx.JmxControlBean.lambda$invokeOperation$7(JmxControlBean.java:384)
	at com.haulmont.cuba.web.jmx.JmxConnectionHelper.withConnection(JmxConnectionHelper.java:106)
	at com.haulmont.cuba.web.jmx.JmxControlBean.invokeOperation(JmxControlBean.java:373)
	at com.haulmont.cuba.web.app.ui.jmxcontrol.inspect.MbeanInspectWindow.runSynchronously(MbeanInspectWindow.java:235)
	at com.haulmont.cuba.web.app.ui.jmxcontrol.inspect.MbeanInspectWindow.invokeOperation(MbeanInspectWindow.java:228)
	at com.haulmont.cuba.web.app.ui.jmxcontrol.inspect.MbeanInspectWindow$1.actionPerform(MbeanInspectWindow.java:194)
	at com.haulmont.cuba.web.gui.components.WebButton.performAction(WebButton.java:46)
	at com.haulmont.cuba.web.gui.components.WebButton.lambda$new$61446b05$1(WebButton.java:38)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510)
	at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:200)
	at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:163)
	at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1037)
	at com.vaadin.ui.Button.fireClick(Button.java:377)
	at com.haulmont.cuba.web.toolkit.ui.CubaButton.fireClick(CubaButton.java:69)
	at com.vaadin.ui.Button$1.click(Button.java:54)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158)
	at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:119)
	at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:444)
	at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:409)
	at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274)
	at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90)
	at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435)
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361)
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:312)
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:203)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107)
	at jespa.http.HttpSecurityService.doFilter(HttpSecurityService.java:1596)
	at com.borets.wedb.web.JespaAuthProvider.doFilter(JespaAuthProvider.java:94)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:112)
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73)
	at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.6.2.cuba24): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Problem compiling [select e.currentRunlife from wedb$ActivityInstall e]. 
[7, 23] The state field path 'e.currentRunlife' cannot be resolved to a valid type.
	at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildException(HermesParser.java:155)
	at org.eclipse.persistence.internal.jpa.jpql.HermesParser.validate(HermesParser.java:347)
	at org.eclipse.persistence.internal.jpa.jpql.HermesParser.populateQueryImp(HermesParser.java:278)
	at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildQuery(HermesParser.java:163)
	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:144)
	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:116)
	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:102)
	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:86)
	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1618)
	... 116 more

Это ожидаемое поведение? Или я что-то делаю не так?

Здравствуйте,

Это ожидаемое поведение.

К сожалению, в JPQL можно использовать только персистентные поля. JPQL полностью транслируется в SQL, который исполняется на СУБД.

Юрий, доброе утро. А что посоветуете? Хотел использовать это valueGroupDatasource. Нужно показать текущую наработку (сегодня - дата старта). Ежедневно заполнять шедулером персистентный атрибут как-то кажется не правильным.

Да, можно воспользоваться ValueCollectionDatasource, в нём можно выбирать отдельные атрибуты вместо сущности и результаты функций агрегации, например:

select o.customer, sum(o.amount)
from demo$Order o
group by o.customer

Видимо, моя ошибка в том, что слишком примитивно описал алгоритм. Это один из случаев, когда оборудование еще “работает”, для вышедшего из строя алгоритм другой, плюс могут быть остановки оборудования и его повторные запуски. Все это хотелось бы учитывать. Сделать это все в одном запросе проблематично.

Да и что-то пока непонятно каким образом можно получить текущую дату в jpql. Литерал CURRENT_DATE использовать не получается.
Кроме того и разницу дат получить затруднительно , чтобы это работало на hsqlldb (отладка) и MS SQL.

select function('DATEDIFF', d, comm.dateAct, fail.dateAct)

Функцию субд нельзя таким образом использовать? Только в WHERE с оператором сравнения?

Можно создать кастомный датасорс унаследованный от CustomValueGroupDatasource. Загружать в нем данные через DataManager.loadValues() и добавлять нужные вычисленные атрибуты.

2 симпатии

Константин, подскажите, пожалуйста, а как в этом случае организовать фильтрацию данных с помощью стандартного экранного фильтра?

Михаил,
Универсальный Filter работает только с обычными источниками данных, загружающими сущности. ValueDatasource в общем случае может содержать произвольные наборы данных, никак не связанные с моделью, поэтому фильтр не может понять по каким атрибутам фильтровать и как модифицировать запрос.

Спасибо, Константин.
И все же прошу некоторых пояснений.

Речь идет про все ValueDatasource или про CustomValueDataSource? Почему спрашиваю, потому что с ValueGroupDatasource фильтр работал нормально.
Есть какой-нибудь обходной вариант? Сейчас в метод
getEntities(Map<String, Object> params) не прилетают параметры фильтра. Может быть возможно их как-то пробросить? Или есть способ по кнопке фильтра сделать ds.refresh(Map<String, Object> params) чтобы они туда прилетели?

Каким образом? Атрибуты какой сущности он отображал?

Константин, не знаю как более подробно ответить на ваш вопрос. Вот так работало.

    <dsContext>
        <valueGroupDatasource id="activitySetDs">
            <query>
                <![CDATA[select inst.well, inst.id, inst, inst.customer, comm, fail, pull, inst.targetRunLife
from wedb$ActivityInstall inst 
left join inst.activities comm
left join comm.activities fail
left join fail.activities pull
where (comm.typeAct = 'C' or comm.typeAct is null) and (fail.typeAct = 'F' or fail.typeAct is null) and (pull.typeAct = 'P' or pull.typeAct is null)
order by inst.well.wellName, inst.dateAct]]>
            </query>
            <properties idProperty="id">
                <property class="com.borets.wedb.entity.Well"
                          name="well"/>
                <property datatype="uuid"
                          name="id"/>
                <property class="com.borets.wedb.entity.ActivityInstall"
                          name="install"/>
                <property class="com.borets.wedb.entity.Customer"
                          name="customer"/>
                <property class="com.borets.wedb.entity.ActivityCommissioning"
                          name="commissioning"/>
                <property class="com.borets.wedb.entity.ActivityFailure"
                          name="failure"/>
                <property class="com.borets.wedb.entity.ActivityPull"
                          name="pull"/>
                <property datatype="int"
                          name="targetRunLife"/>
            </properties>
        </valueGroupDatasource>
    </dsContext>
    <dialogMode height="600"
                width="800"/>
    <layout expand="activityInstallsTable"
            spacing="true">
        <filter id="filter"
                applyTo="activityInstallsTable"
                datasource="activitySetDs">
            <custom caption="Oilfield"
                    name="oilfield"
                    paramClass="com.borets.wedb.entity.Oilfield">({E}.well.oilfield.id = ?)</custom>
            <custom caption="Well"
                    name="well"
                    paramClass="com.borets.wedb.entity.Well"
                    paramWhere="{E}.oilfield.id = :component$filter.oilfield83997">({E}.well.id = ?)</custom>
        </filter>

При использовании своего класса не работает.

        <valueGroupDatasource id="activitySetDs"
                              datasourceClass="com.borets.wedb.ds.ActivitySetValueGroupDs">
            <properties idProperty="id">
                <property class="com.borets.wedb.entity.Well"
                          name="well"/>
                <property datatype="uuid"
                          name="id"/>
                <property class="com.borets.wedb.entity.ActivityInstall"
                          name="install"/>
                <property class="com.borets.wedb.entity.Customer"
                          name="customer"/>
                <property class="com.borets.wedb.entity.ActivityCommissioning"
                          name="commissioning"/>
                <property class="com.borets.wedb.entity.ActivityFailure"
                          name="failure"/>
                <property class="com.borets.wedb.entity.ActivityPull"
                          name="pull"/>
                <property datatype="int"
                          name="targetRunLife"/>
            </properties>
        </valueGroupDatasource>

А, то есть фильтр отображал только эти 2 заранее заданных условия, и вам этого было достаточно?
Может тогда достаточно просто задать на экране пару полей и кнопку “Поиск”, и по значениям этих полей формировать нужный запрос в кастомном датасорсе?

1 симпатия

Константин, извиняюсь за назойливость. Решил пойти немного другим путем и вернуться к варианту “в котором работало”.
Добавил к запросу еще одно поле

cast(inst.currentRunlife float)/cast(inst.targetRunLife float)

В итоге при попытке применить фильтр, ловлю исключение:

Stack
com.haulmont.cuba.core.sys.jpql.JpqlSyntaxException: Errors found for input jpql:[select inst.well, inst.id, inst, inst.customer, comm, fail, pull, inst.targetRunLife, inst.currentRunlife, cast(inst.currentRunlifefloat)/cast(inst.targetRunLifefloat) from wedb$ActivityInstall inst left join inst.commissionings comm on comm.typeAct = @enum(com.borets.wedb.entity.Enum_ActivityType.COMMISSIONING) left join inst.failures fail on fail.typeAct = @enum(com.borets.wedb.entity.Enum_ActivityType.FAILURE) left join inst.pulls pull on pull.typeAct = @enum(com.borets.wedb.entity.Enum_ActivityType.PULL) where (inst.well.oilfield.id = :component_filter_oilfield83997) order by inst.well.wellName, inst.dateAct]
CommonErrorNode [<unexpected: [@40,112:115='inst',<61>,1:112], resync=cast(>]
CommonErrorNode [<mismatched token: [@41,116:116='.',<68>,1:116], resync=.currentRunlifefloat)/cast(inst.targetRunLifefloat) from wedb$ActivityInstall inst left join inst.commissionings comm on comm.typeAct = @enum(com.borets.wedb.entity.Enum_ActivityType.COMMISSIONING) left join inst.failures fail on fail.typeAct = @enum(com.borets.wedb.entity.Enum_ActivityType.FAILURE) left join inst.pulls pull on pull.typeAct = @enum(com.borets.wedb.entity.Enum_ActivityType.PULL)>]
	at com.haulmont.cuba.core.sys.jpql.Parser.checkTreeForExceptions(Parser.java:104)
	at com.haulmont.cuba.core.sys.jpql.Parser.parse(Parser.java:40)
	at com.haulmont.cuba.core.sys.jpql.QueryTree.<init>(QueryTree.java:49)
	at com.haulmont.cuba.core.sys.jpql.QueryTree.<init>(QueryTree.java:40)
	at com.haulmont.cuba.core.global.QueryParserAstBased.getTree(QueryParserAstBased.java:71)
	at com.haulmont.cuba.core.global.QueryParserAstBased.getAnalyzer(QueryParserAstBased.java:85)
	at com.haulmont.cuba.core.global.QueryParserAstBased.getParamNames(QueryParserAstBased.java:92)
	at com.haulmont.cuba.gui.data.impl.AbstractCollectionDatasource.createDataQuery(AbstractCollectionDatasource.java:525)
	at com.haulmont.cuba.gui.data.impl.ValueDatasourceDelegate.beforeLoadValues(ValueDatasourceDelegate.java:98)
	at com.haulmont.cuba.gui.data.impl.ValueDatasourceDelegate.loadData(ValueDatasourceDelegate.java:81)
	at com.haulmont.cuba.gui.data.impl.ValueGroupDatasourceImpl.loadData(ValueGroupDatasourceImpl.java:83)
	at com.haulmont.cuba.gui.data.impl.CollectionDatasourceImpl.refresh(CollectionDatasourceImpl.java:161)
	at com.haulmont.cuba.gui.data.impl.CollectionDatasourceImpl.refreshIfNotSuspended(CollectionDatasourceImpl.java:112)
	at com.haulmont.cuba.gui.components.filter.FilterDelegateImpl.refreshDatasource(FilterDelegateImpl.java:1644)
	at com.haulmont.cuba.gui.components.filter.FilterDelegateImpl.apply(FilterDelegateImpl.java:1488)
	at com.haulmont.cuba.gui.components.filter.FilterDelegateImpl$1.actionPerform(FilterDelegateImpl.java:289)
	at com.haulmont.cuba.web.gui.components.WebButton.performAction(WebButton.java:46)
	at com.haulmont.cuba.web.gui.components.WebButton.lambda$new$61446b05$1(WebButton.java:38)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510)
	at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:200)
	at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:163)
	at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1037)
	at com.vaadin.ui.Button.fireClick(Button.java:377)
	at com.haulmont.cuba.web.toolkit.ui.CubaButton.fireClick(CubaButton.java:69)
	at com.vaadin.ui.Button$1.click(Button.java:54)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158)
	at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:119)
	at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:444)
	at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:409)
	at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274)
	at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90)
	at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435)
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361)
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:312)
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:203)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107)
	at jespa.http.HttpSecurityService.doFilter(HttpSecurityService.java:1596)
	at com.borets.wedb.web.JespaAuthProvider.doFilter(JespaAuthProvider.java:94)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:112)
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73)
	at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

Если убрать cast-ы все ОК. Если подставить в запрос искомое id и скормить его jmx-бину PersistenceManager, тоже все ОК.
Пробовал добавлять скобки в разных местах и псевдонимы, не помогло.

Михаил,

Если вместо cast(inst.currentRunlife float)/cast(inst.targetRunLife float) оставить cast(inst.currentRunlife float) будет ли работать? (проверка исключительно для теста)

Да, работает, как положено.

Похоже на ошибку. Тикет: https://github.com/cuba-platform/cuba/issues/1710.
Спасибо что сообщили о проблеме.

1 симпатия