2014-01-14 34 views
0

由於某些原因,我不能說,有例外,當我嘗試使用子查詢從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; 

} 

這裏是例外

內部異常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL語法錯誤; '.productscategoryid FROM productscategory t1 WHERE(t1.productcatgoryname ='Pri'at line 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 parameter bound] 調用:SELECT DISTINCT t0.productname FROM產品t0 WHERE t0.productscategoryid IN(SELECT t1.productscategoryid.t1.productscategoryid FROM productscategory t1 WHERE(t1.productcatgoryname =?)) bind => [1 parameter bound] Query:TupleQuery(referenceClass = Products sql =「SELECT DISTINCT t0.productname FROM產品t0 WHERE t0.productscategoryid IN(SELECT t1.productscategoryid.t1.productscategoryid FROM productscategory t1 WHERE(t1.productcatgoryname =?))「) Query: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 =?))「) at org.eclipse.persistence.internal.jpa.QueryImpl.getDetailedException(QueryImpl.java:378) at org。 eclipse.persistence.internal.jpa.QueryImpl.getDetailedException(QueryImpl.java:378) at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:260) at org.eclipse.persistence.internal。 jpa.QueryImpl.getResultList(QueryImpl.java:469) at com.inventory.service.ProductsServices.getProductsDistinctBySubQueri esName(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持久性服務 - 2.5.1.v20130918-f2b9fc5):org.eclipse.persistence.exceptions.DatabaseException 內部異常:com .mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL語法中有錯誤; '.productscategoryid FROM productscategory t1 WHERE(t1.productcatgoryname ='Pri'at line 1 錯誤代碼:1064 調用:SELECT DISTINCT t0.productname從產品中檢查與您的MySQL服務器版本對應的手冊t0 WHERE t0.productscategoryid IN(SELECT t1.productscategoryid.t1.productscategoryid FROM productscategory t1 WHERE(t1.productcatgoryname =?)) bind => [1 parameter bound] Query: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 =?))「) at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java :340) at org.eclipse.persistence.internal.d atabaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:682) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:558) at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall( AbstractSession.java:1991) at 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.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228) 在org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:299) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:694) at org.eclipse.persistence。 internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2738) at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllReportQueryRows(ExpressionQueryMechanism.java:2675) at org.eclipse.persistence.queries.ReportQuery.executeDatabaseQuery(ReportQuery.java:848) at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899) at org.eclipse.persistence.queries。 ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1127) at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:403) at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1215) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1793) at org.eclipse。 persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1775) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1740) at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:258) ... 5 more 引起:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL語法中有錯誤;檢查與您的MySQL服務器版本對應的手冊,以便在'productproductscategoryid FROM productscategory t1 WHERE(t1.productcatgoryname ='Pri'at line 1 at 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) at com.mysql.jdbc.Util.getInstance(Util.java:386) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java: 1053) at com.mysql.jdbc.MysqlIO.checkErro rPacket(MysqlIO.java:4120) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503) at com.mysql。 jdbc.MysqlIO.sqlQueryDirect在(MysqlIO.java:2664) 在com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794) 在com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2322) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelect(DatabaseAccessor.java:1007) at org.eclipse.persistence.internal.databaseaccess。 DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:642) ... 24更多

回答

0

嘗試使用此查詢而不是您的,這與EclipseLink提供程序完美協同工作,不確定您的查詢在eclipselink中不工作但在休眠狀態下工作,我測試了下面的查詢,您將能夠選擇基於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。

+0

它的工作!你已經保存了一天!太感謝了。這是多麼的經驗。再一次感謝你! – user3133951

+0

雖然當我設置不同(真)時,我似乎無法獲得不同的值。奇怪! – user3133951