List 从CriteriaQuery获取列表时出现异常

List 从CriteriaQuery获取列表时出现异常,list,exception,subquery,criteria-api,criteriaquery,List,Exception,Subquery,Criteria Api,Criteriaquery,由于某些原因,我无法判断,当我尝试使用子查询从CriteriaQuery获取列表时出现异常。有人请帮忙!!! 代码如下: public String[] getProductsDistinctBySubQueriesName(String category) { CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery<Tuple> criteria = builder.createTupleQu

由于某些原因,我无法判断,当我尝试使用子查询从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;

}
这是个例外

内部异常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解使用productscategoryid的正确语法,该语法来自productscategory t1,其中第1行的t1.productcatgoryname='Pri' 错误代码:1064 错误代码:1064 调用:从产品t0中选择不同的t0.productname,其中t0.productscategoryid在产品t0中选择t1.productscategoryid.t1.productscategoryid从产品sCategoryName=? 绑定=>[1参数绑定] 调用:从产品t0中选择不同的t0.productname,其中t0.productscategoryid在产品t0中选择t1.productscategoryid.t1.productscategoryid从产品sCategoryName=? 绑定=>[1参数绑定] 查询:TupleQueryreferenceClass=Products sql=从产品t0中选择不同的t0.productname,其中t0.PRODUCTSCATEGORYD在产品t0中选择t1.PRODUCTSCATEGORYD.t1.PRODUCTSCATEGORYD在产品SCATEGORYT1中选择t1.PRODUCTSCATEGORYD,其中t1.productcatgoryname=? 查询:TupleQueryreferenceClass=Products sql=从产品t0中选择不同的t0.productname,其中t0.PRODUCTSCATEGORYD在产品t0中选择t1.PRODUCTSCATEGORYD.t1.PRODUCTSCATEGORYD在产品SCATEGORYT1中选择t1.PRODUCTSCATEGORYD,其中t1.productcatgoryname=? 位于org.eclipse.persistence.internal.jpa.QueryImpl.getDetailedExceptionQueryImpl.java:378 位于org.eclipse.persistence.internal.jpa.QueryImpl.getDetailedExceptionQueryImpl.java:378 位于org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQueryQueryImpl.java:260 位于org.eclipse.persistence.internal.jpa.QueryImpl.getResultListQueryImpl.java:469 在com.inventory.service.ProductsServices.getProductsDistinctBySubQueriesNameProductsServices.java:112 位于com.inventory.service.ProductsServices.getAllByNameProductsServices.java:211 位于com.inventory.server.InventorySocketRequest.getServiceClassInventorySocketRequest.java:77 位于com.inventory.server.InventorySocketRequest.runInventorySocketRequest.java:44 原因:异常[EclipseLink-4002]Eclipse持久性服务-2.5.1.v20130918-f2b9fc5:org.Eclipse.Persistence.exceptions.DatabaseException 内部异常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解使用productscategoryid的正确语法,该语法来自productscategory t1,其中第1行的t1.productcatgoryname='Pri' 错误代码:1064 调用:从产品t0中选择不同的t0.productname,其中t0.productscategoryid在产品t0中选择t1.productscategoryid.t1.productscategoryid从产品sCategoryName=? 绑定=>[1参数绑定] 查询:TupleQueryreferenceClass=Products sql=从产品t0中选择不同的t0.productname,其中t0.PRODUCTSCATEGORYD在产品t0中选择t1.PRODUCTSCATEGORYD.t1.PRODUCTSCATEGORYD在产品SCATEGORYT1中选择t1.PRODUCTSCATEGORYD,其中t1.productcatgoryname=? 位于org.eclipse.persistence.exceptions.DatabaseException.sqlExceptionDatabaseException.java:340 位于org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCallDatabaseAccessor.java:682 位于org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCallDatabaseAccessor.java:558 位于org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCallAbstractSession.java:1991 位于org.eclipse.persistence.sessions.server.ServerSession.executeCallServerSession.java:570 位于org.eclipse.persistence.internal.querys.DatasourceCallQueryMechanism.executeCallDatasourceCallQueryMechanism.java:242 位于org.eclipse.persistence.internal.querys.DatasourceCallQueryMechanism.executeCallDatasourceCallQueryMechanism.java:228 位于org.eclipse.persistence.internal.querys.DatasourceCallQueryMechanism.executeSelectCallDatasourceCallQueryMechanism.java:299 在org.eclipse.persistence.internal.querys.DatasourceCallQueryMechanism.SelectAllRowsDatasourceCellQueryMechanism.java:694 在org.eclipse.persistence.internal.querys.ExpressionQueryMechanism.java:2738上选择AllRowsFromTableExpressionQueryMechanism.java 在org.eclipse.persistence.internal.querys.ExpressionQueryMechanism.selectAllReportQueryRowsExpressionQueryMechanism.java:2675 在org.eclipse.persistence.querys.ReportQuery.executeDatabaseQueryReportQuery.java:848 位于org.eclipse.persistence.querys.DatabaseQuery.executeDatabaseQuery.java:899 位于org.eclipse.persistence.querys.ObjectLevelReadQuery.executeObjectLevelReadQuery.java:1127 位于org.eclipse.persistence.querys.ReadAllQuery.executeReadAllQuery.java:403 位于org.eclipse.persistence.querys.ObjectLevelReadQuery.executeInUnitOfWorkObjectLevelReadQuery.java:1215 位于org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQueryUnit java:2896 位于org.eclipse.persistence.internal.sessions.AbstractSession.executeQueryAbstractSession.java:1793 位于org.eclipse.persistence.internal.sessions.AbstractSession.executeQueryAbstractSession.java:1775 位于org.eclipse.persistence.internal.sessions.AbstractSession.executeQueryAbstractSession.java:1740 位于org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQueryQueryImpl.java:258 ... 还有5个 原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解使用productscategoryid的正确语法,该语法来自productscategory t1,其中第1行的t1.productcatgoryname='Pri' 在sun.reflect.NativeConstructorAccessorImpl.newInstance0Native方法中 位于sun.reflect.NativeConstructorAccessorImpl.newInstanceNativeConstructorAccessorImpl.java:57 在sun.reflect.DelegatingConstructorAccessorImpl.newInstanceDelegatingConstructorAccessorImpl.java:45 位于java.lang.reflect.Constructor.newInstanceConstructor.java:525 位于com.mysql.jdbc.Util.handleNewInstanceUtil.java:411 位于com.mysql.jdbc.Util.getInstanceUtil.java:386 位于com.mysql.jdbc.SQLError.createSQLExceptionSQLError.java:1053 在com.mysql.jdbc.MysqlIO.checkErrorPacketMysqlIO.java:4120 在com.mysql.jdbc.MysqlIO.checkErrorPacketMysqlIO.java:4052 在com.mysql.jdbc.MysqlIO.sendCommandMysqlIO.java:2503 位于com.mysql.jdbc.MysqlIO.sqlQueryDirectMysqlIO.java:2664 位于com.mysql.jdbc.ConnectionImpl.execSQLConnectionImpl.java:2794 位于com.mysql.jdbc.PreparedStatement.executeInternalPreparedStatement.java:2155 位于com.mysql.jdbc.PreparedStatement.executeQueryPreparedStatement.java:2322 位于org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelectDatabaseAccessor.java:1007 位于org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCallDatabaseAccessor.java:642
... 24更多

尝试使用此查询而不是您的查询,这与EclipseLink提供程序完美配合,不确定您的查询在EclipseLink中不起作用,但在hibernate中起作用,我测试了下面的查询,您将能够基于ProductCategoryName选择产品

    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。

它有效!!!你挽救了这一天!非常感谢。这是多么令人难忘的经历啊。再次感谢您!当我设置distincttrue时,我似乎无法得到不同的值。奇怪的