Nano Hash - криптовалюты, майнинг, программирование

Запросы конструктора к непостоянной сущности неожиданно не предоставляют логический параметр в качестве аргумента конструктора.

В базе данных MySQL две таблицы.

  • user_table
  • Обратная связь

Связь между ними интуитивно понятна — один ко многим от user_table до feedback.


Мне нужно получить только список выбранных столбцов из этих таблиц, которые

  • From feedback
    • feedbackId (java.lang.Long)
    • Заголовок отзыва (java.lang.String)
    • FeedbackDescription (Строка, украшенная @Lob)
    • дата отзыва (org.joda.time.DateTime)
    • отзыв (java.lang.Boolean)
  • From user_table
    • userId (java.lang.Long)
    • Имя (java.lang.String)

Эти многие поля из множества других необходимо получить, выполнив запрос.

Запрос критериев выглядит следующим образом.

CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery<FeedbackUtils>criteriaQuery = criteriaBuilder.createQuery(FeedbackUtils.class);
Metamodel metamodel = entityManager.getMetamodel();
EntityType<Feedback> entityType = metamodel.entity(Feedback.class);
Root<Feedback> root = criteriaQuery.from(entityType);

List<Selection<?>>selections=new ArrayList<Selection<?>>();
selections.add(root.get(Feedback_.feedbackId));
selections.add(root.get(Feedback_.feedbackTitle));
selections.add(root.get(Feedback_.feedbackDescription));
selections.add(root.get(Feedback_.feedbackDate));
selections.add(root.get(Feedback_.testimonial));

Join<Feedback, UserTable> join = root.join(Feedback_.userId, JoinType.INNER);
selections.add(join.get(UserTable_.userId));
selections.add(join.get(UserTable_.firstName));

criteriaQuery.select(criteriaBuilder.construct(FeedbackUtils.class, selections.toArray(new Selection[0])));
criteriaQuery.orderBy(criteriaBuilder.desc(root.get(Feedback_.feedbackId)));

List<FeedbackUtils>list = entityManager.createQuery(criteriaQuery).setFirstResult(first).setMaxResults(pageSize).getResultList();

Класс FeedbackUtils выглядит следующим образом.

import java.io.Serializable;
import org.joda.time.DateTime;

public final class FeedbackUtils implements Serializable
{
    private static final long serialVersionUID = 1L;
    private Long feedbackId;
    private String feedbackTitle;
    private String feedbackDescription;
    private DateTime feedbackDate;
    private Boolean testimonial;    //This causes the exception
    private Long userId;
    private String firstName;

    public FeedbackUtils(Long feedbackId, String feedbackTitle, String feedbackDescription, DateTime feedbackDate, Boolean testimonial, Long userId, String firstName) {
        this.feedbackId = feedbackId;
        this.feedbackTitle = feedbackTitle;
        this.feedbackDescription = feedbackDescription;
        this.feedbackDate = feedbackDate;
        this.testimonial = testimonial;
        this.userId = userId;
        this.firstName = firstName;
    }

    //Getters and setters.
}

Сопоставление свойства testimonial в объекте Feedback выглядит следующим образом.

@Column(name = "testimonial")
private Boolean testimonial;

Это тип TINYINT(1) в MySQL.


Приведенный выше запрос при попытке вызвать следующее исключение.

SEVERE:   Error Rendering View[/admin_side/Feedback.xhtml]
javax.ejb.EJBException
    at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748)
    at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:698)
    at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:503)
    at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4475)
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2009)
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1979)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:220)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)
    at $Proxy662.getList(Unknown Source)
    at admin.bean.FeedbackManagedBean.load(FeedbackManagedBean.java:174)
    at org.primefaces.component.datatable.DataTable.loadLazyData(DataTable.java:815)
    at org.primefaces.component.datatable.DataTableRenderer.preRender(DataTableRenderer.java:93)
    at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:81)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
    at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:85)
    at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:68)
    at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:204)
    at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:121)
    at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:58)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1864)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
    at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:81)
    at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:68)
    at org.primefaces.component.layout.LayoutUnitRenderer.encodeEnd(LayoutUnitRenderer.java:49)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1864)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1860)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1860)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1860)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:461)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:70)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
    at filter.NoCacheFilter.doFilter(NoCacheFilter.java:28)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
    at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.IllegalArgumentException: An exception occured looking on class: class util.FeedbackUtils for constructor using selection criteria types as arguments.  If this CriteriaQuery was not intended to be a constructor query please verify that the selection matches the return type.
    at org.eclipse.persistence.internal.jpa.querydef.CriteriaQueryImpl.populateAndSetConstructorSelection(CriteriaQueryImpl.java:409)
    at org.eclipse.persistence.internal.jpa.querydef.CriteriaQueryImpl.select(CriteriaQueryImpl.java:93)
    at admin.beans.FeedbackBean.getList(FeedbackBean.java:145)
    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:601)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153)
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4695)
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:630)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:582)
    at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:46)
    at sun.reflect.GeneratedMethodAccessor478.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:582)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140)
    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:601)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369)
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4667)
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4655)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212)
    ... 67 more
Caused by: java.lang.NoSuchMethodException: util.FeedbackUtils.<init>(java.lang.Long, java.lang.String, java.lang.String, org.joda.time.DateTime, java.lang.Boolean, java.lang.Long, java.lang.String)
    at java.lang.Class.getConstructor0(Class.java:2721)
    at java.lang.Class.getConstructor(Class.java:1674)
    at org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getConstructorFor(PrivilegedAccessHelper.java:157)
    at org.eclipse.persistence.internal.jpa.querydef.CriteriaQueryImpl.populateAndSetConstructorSelection(CriteriaQueryImpl.java:396)
    ... 98 more

Это прекрасно работает, когда тип testimonial изменяется с Boolean на Object в классе FeedbackUtils.

Почему не дает работать запрос конструктора, если ему задан тип Boolean в списке параметров конструктора?

Я использую EclipseLink 2.5.1.


ИЗМЕНИТЬ:

В конструкторе класса FeedbackUtils следующая проверка,

testimonial.getClass().getName()

возвращает java.lang.Boolean

и все последующие,

(testimonial instanceof Boolean)
testimonial.getClass().equals(Boolean.class)
testimonial.getClass().isAssignableFrom(Boolean.class)

вернуть true.

Следовательно, следующее приведение типов также допустимо.

(Boolean)testimonial

Вплоть до связанной XHTML-страницы он ведет себя точно так же, как Boolean.


  • Сообщите об ошибке, чтобы изменить поведение, но проблема в том, что тип TINYINT(1), возвращаемый драйвером, передается методу конструктора как есть. Я предполагаю, что он возвращает числовой тип - проверьте, какой тип объекта находится в вашем конструкторе. При построении экземпляра обратной связи EclipseLink преобразует тип, возвращаемый драйвером, в логический, поскольку он знает тип в классе Feedback, но не имеет информации о типе в конструкторе. 22.04.2014
  • Кажется Boolean везде. Добавил к сообщению. 22.04.2014
  • Само исключение неуклюже: java.lang.NoSuchMethodException: util.FeedbackUtils.<init>(java.lang.Long, java.lang.String, java.lang.String, org.joda.time.DateTime, java.lang.Boolean, java.lang.Long, java.lang.String). Он указывает правильную сигнатуру метода, включая тип параметра java.lang.Boolean (не java.lang.Object) в правильном порядке. Метод уже объявлен там в классе FeedbackUtils. 22.04.2014
  • @Tiny: Какую версию MySQL вы используете? 23.04.2014
  • @wypieprz: я использую версию MySQL 5.6.11. Однако это должно быть больше связано с ORM, а не с базовой базой данных. 24.04.2014
  • Мне просто интересно, поможет ли замена текущего определения столбца на @Column(name = "testimonial", columnDefinition = "BIT(1)"). 24.04.2014
  • @ user75ponic: трассировка стека исключений в кавычках практически нечитаема. Отмена изменения. 24.11.2015

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..