List 从CriteriaQuery获取列表时出现异常
由于某些原因,我无法判断,当我尝试使用子查询从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
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时,我似乎无法得到不同的值。奇怪的