Исключение при получении списка из CriteriaQuery

по какой-то причине я не могу сказать, есть исключение, когда я пытаюсь получить список из CriteriaQuery, используя подзапрос. помогите кто нибудь!!! вот код:

public String[] getProductsDistinctBySubQueriesName(String category) {
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Tuple> criteria = builder.createTupleQuery();
    //subquery
    Subquery<Integer> subqueries = criteria.subquery(Integer.class);
    Root<Productscategory> productCategory = subqueries.from(Productscategory.class);
    subqueries.select(productCategory.<Integer>get("productscategoryid"))
            .where(builder.equal((productCategory.<String>get("productcatgoryname")), category));
    //outerquery
    Root<Products> root = criteria.from(Products.class);
    criteria.multiselect(root.get(Products_.productname)).distinct(true)
            .where(builder.in(root.get("productscategoryid")).value(subqueries));


    List<Tuple> tupleResult = em.createQuery(criteria).getResultList(); // the exception is thrown here
    String[] arrayProducts = new String[tupleResult.size()];
    for (int i = 0; i < tupleResult.size(); i++) {
        arrayProducts[i] = (String) tupleResult.get(i).get(0);
    }
    return arrayProducts;

}

вот исключение

Попробуйте использовать этот запрос вместо вашего, он отлично работает с провайдером EclipseLink, не уверен, что ваш запрос не работает в eclipselink, но работает в спящем режиме, я протестировал приведенный ниже запрос, и вы сможете выбирать продукты на основе ProductCategoryName.


person user3133951    schedule 14.01.2014    source источник


Ответы (1)


В какой категории находится название категории, которую вы пытаетесь найти.

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaQuery");
    EntityManager em = emf.createEntityManager();

    String category = "cat2";

    CriteriaBuilder builder = em.getCriteriaBuilder();

    CriteriaQuery<Products> query = builder.createQuery(Products.class);
    Root<Products> products = query.from(Products.class);

    Subquery<Productscategory> squery = query.subquery(Productscategory.class);
    Root<Productscategory> productCategoryRoot = squery.from(Productscategory.class);
    Join<Productscategory, Products> join = productCategoryRoot.join("productsCollection");

    squery.select(productCategoryRoot)
    .where(builder.equal(join, products), builder.equal(productCategoryRoot.get("productcatgoryname"), category));

    query.where( builder.exists(squery));
    List<Products> productList = em.createQuery(query).getResultList(); 

    for (Products product : productList) {
           System.out.println(product);
    }

Это решило проблему =).. Если это сработает, не забудьте принять ответ XD.

Это сработало!!! Вы спасли день! бесконечно благодарен. какой это был опыт. еще раз, спасибо!

person Koitoer    schedule 26.01.2014
comment
я не могу получить разные значения, хотя, когда я устанавливаю отличные (истинные). Странный !!! - person user3133951; 27.01.2014
comment
Внутреннее исключение: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '.productscategoryid FROM productscategory t1 WHERE (t1.productcatgoryname = 'Pri' в строке 1 Код ошибки: 1064 Код ошибки: 1064 Вызов: SELECT DISTINCT t0.productname FROM products t0 WHERE t0.productscategoryid IN (SELECT t1.productscategoryid.t1.productscategoryid FROM productscategory t1 WHERE (t1.productcatgoryname = ?)) bind => [1 привязанный параметр] Вызов: SELECT DISTINCT t0.productname FROM products t0 WHERE t0. productscategoryid IN (SELECT t1.productscategoryid.t1.productscategoryid FROM productscategory t1 WHERE (t1.productcatgoryname = ?)) bind => [1 привязанный параметр] Query: TupleQuery(referenceClass=Products sql="SELECT DISTINCT t0.productname FROM products t0 WHERE t0.productscategoryid IN (ВЫБРАТЬ t1.productscategoryid.t1.productscategoryid FROM productscategory t1 WHERE (t1.productcatgoryname = ?))") Запрос: TupleQuery(referenceClass=Products sql="SELECT DISTINCT t0.productname F ROM products t0 WHERE t0.productscategoryid IN (SELECT t1.productscategoryid.t1.productscategoryid FROM productscategory t1 WHERE (t1.productcatgoryname = ?))") в org.eclipse.persistence.internal.jpa.QueryImpl.getDetailedException(QueryImpl.java: 378) в org.eclipse.persistence.internal.jpa.QueryImpl.getDetailedException(QueryImpl.java:378) в org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:260) в org.eclipse.persistence .internal.jpa.QueryImpl.getResultList(QueryImpl.java:469) в com.inventory.service.ProductsServices.getProductsDistinctBySubQueriesName(ProductsServices.java:112) в com.inventory.service.ProductsServices.getAllByName(ProductsServices.java:211) в com.inventory.server.InventorySocketRequest.getServiceClass(InventorySocketRequest.java:77) в com.inventory.server.InventorySocketRequest.run(InventorySocketRequest.java:44) Причина: Исключение [EclipseLink-4002] (Eclipse Persistence Services — 2.5.1 .v20130918-f 2b9fc5): org.eclipse.persistence.exceptions.DatabaseException Внутреннее исключение: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '.productscategoryid FROM productscategory t1 WHERE (t1.productcatgoryname = 'Pri' в строке 1 Код ошибки: 1064 Call: SELECT DISTINCT t0.productname FROM products t0 WHERE t0.productscategoryid IN (SELECT t1.productscategoryid.t1.productscategoryid FROM productscategory t1 WHERE (t1.productcatgoryname = ? )) bind => [1 параметр привязан] Запрос: TupleQuery(referenceClass=Products sql="SELECT DISTINCT t0.productname FROM products t0 WHERE t0.productscategoryid IN (SELECT t1.productscategoryid.t1.productscategoryid FROM productscategory t1 WHERE (t1.productcatgoryname = ?))") в org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:340) в org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:682) в org.eclipse .persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:558) в org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1991) в org.eclipse.persistence.sessions.server.ServerSession .executeCall(ServerSession.java:570) в org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:242) в org.eclipse.persistence.internal.queries.DatasourceCallQ ueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228) в org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:299) в org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java: 694) в org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2738) в org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllReportQueryRows(ExpressionQueryMechanism.java:2675) в org.eclipse.persistence .queries.ReportQuery.executeDatabaseQuery(ReportQuery.java:848) в org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899) в org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1127) ) в org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:403) в org.eclipse.persistence.queries.Obje ctLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1215) в org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896) в org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java: 1793) в org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1775) в org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1740) в org.eclipse.persistence .внутренняя.jpa. QueryImpl.executeReadQuery(QueryImpl.java:258) ... еще 5 Причина: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '.productscategoryid FROM productscategory t1 WHERE (t1.productcatgoryname = 'Pri' в строке 1 в sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun. Reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) в sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) в java.lang.reflect.Constructor.newInstance(Constructor.java:525) в com.mysql.jdbc .Util.handleNewInstance(Util.java:411) в com.mysql.jdbc.Util.getInstance(Util.java:386) в com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053) в com.mysql. jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120) в com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052) в com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503) в com.mysql .jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664) на com.mys ql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794) в com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) в com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2322) в org .eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelect(DatabaseAccessor.java:1007) в org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:642) ... еще 24 - person user3133951; 30.01.2014