2017-12-09 6 views
0

Ich versuche, Produkte nach categoryId, categoryName zu erhalten und so schrieb ich in einigen benutzerdefinierten Abfragen, aber nichts scheint zu funktionieren. Ich bin neu im Winterschlaf.Hibernate Spring MVC

// dies ist meine Produktklasse

package springmvc.java.domain;   
    @Entity 
    @Table(name = "product") 
    public class Product { 

     @Id 
     @Column(name = "productId" , nullable = false) 
     private Long productId; 

     @Column(name = "productName", nullable = false) 
     private String productName; 

     @Column(name = "productCost", nullable = false) 
     private double productCost; 

     @Column(name = "productDescription") 
     private String productDescription; 

     @ManyToOne(cascade = CascadeType.ALL) 
     @JoinColumn(name = "categoryId", nullable = false) 
     private Category category; 

     public Long getProductId() { 
      return productId; 
     } 

     public void setProductId(Long productId) { 
      this.productId = productId; 
     } 

     public String getProductName() { 
      return productName; 
     } 

     public void setProductName(String productName) { 
      this.productName = productName; 
     } 

     public double getProductCost() { 
      return productCost; 
     } 

     public void setProductCost(double productCost) { 
      this.productCost = productCost; 
     } 

     public String getProductDescription() { 
      return productDescription; 
     } 

     public void setProductDescription(String productDescription) { 
      this.productDescription = productDescription; 
     } 

    } 

// ****************************** **************************

// Kategorie Klasse

package springmvc.java.domain; 
    @Entity 
    @Table(name = "category") 
    public class Category { 

     @Id 
     @Column(name = "categoryId", nullable = false) 
     private Long categoryId; 

     @Column(name = "categoryName", nullable = false) 
     private String categoryName; 

     @Column(name = "categoryDescription") 
     private String categoryDescription; 

     @OneToMany(cascade = CascadeType.ALL, mappedBy = "category", fetch = FetchType.EAGER) 
     private List<Product> products; 

     public Long getCategoryId() { 
      return categoryId; 
     } 

     public void setCategoryId(Long categoryId) { 
      this.categoryId = categoryId; 
     } 

     public String getCategoryName() { 
      return categoryName; 
     } 

     public void setCategoryName(String categoryName) { 
      this.categoryName = categoryName; 
     } 

     public String getCategoryDescription() { 
      return categoryDescription; 
     } 

     public void setCategoryDescription(String categoryDescription) { 
      this.categoryDescription = categoryDescription; 
     } 

     public List<Product> getProducts() { 
      return products; 
     } 

     public void setProducts(List<Product> products) { 
      this.products = products; 
     } 

    } 

// ******* ************************************************* // Mein Produkt DAO

, die JPA Repository erweitert Ich versuche, benutzerdefinierte Methoden mit Hilfe von @Query Annotation

package springmvc.java.dao; 
    import springmvc.java.domain.Product; 
    public interface ProductDAO extends JpaRepository<Product,Long> { 

     @Query("select p from Product p where p.categoryId = :categoryId") 
     public List<Product> findProductsByCategoryId(@Param("categoryId") Long categoryId);`enter code here` 
    } 

// ********************** zu schreiben **********************************
// Stack Trace

Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List springmvc.java.dao.ProductDAO.findProductsByCategoryId(java.lang.Long)! 
    at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:92) 
    at org.springframework.data.jpa.repository.query.SimpleJpaQuery.<init>(SimpleJpaQuery.java:62) 
    at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromMethodWithQueryString(JpaQueryFactory.java:72) 
    at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromQueryAnnotation(JpaQueryFactory.java:53) 
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:136) 
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:204) 
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:73) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:416) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:206) 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:251) 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:237) 
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:92) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) 
    ... 47 more 
Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: categoryId of: springmvc.java.domain.Product [select p from springmvc.java.domain.Product p where p.categoryId = :categoryId] 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1374) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:294) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:344) 
    at com.sun.proxy.$Proxy36.createQuery(Unknown Source) 
    at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:86) 
    ... 60 more 
Caused by: org.hibernate.QueryException: could not resolve property: categoryId of: springmvc.java.domain.Product [select p from springmvc.java.domain.Product p where p.categoryId = :categoryId] 
    at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83) 
    at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:77) 
    at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1968) 
    at org.hibernate.hql.internal.ast.tree.FromElementType.getPropertyType(FromElementType.java:313) 
    at org.hibernate.hql.internal.ast.tree.FromElement.getPropertyType(FromElement.java:494) 
    at org.hibernate.hql.internal.ast.tree.DotNode.getDataType(DotNode.java:598) 
    at org.hibernate.hql.internal.ast.tree.DotNode.prepareLhs(DotNode.java:266) 
    at org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:213) 
    at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:118) 
    at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:114) 
    at org.hibernate.hql.internal.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:881) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1264) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4426) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3898) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2076) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:794) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:595) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299) 
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80) 
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168) 
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:221) 
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:199) 
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1778) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:291) 
    ... 67 more 

Antwort

0

categoryId ist in dein Tisch nicht in deiner Entität. JPQL wird für Entitäten verwendet.

Versuch: select p from Product p where p.category = :category

0

categoryId - es ist eigentlich eine andere Einheit in Ihrer Beziehung und Sie müssen ihre id Feld zuzugreifen.

Query("select p from Product p where p.categoryId.id = :categoryId") public List<Product> findProductsByCategoryId(@Param("categoryId") Long categoryId);

0

korrekte Abfrage - wählen p von Produkt p, wobei p.category =: CategoryID“

Bitte beachten Sie, dass, Eigenschaftsnamen in Product-Entität definiert ist 'Kategorie' und nicht 'catagoryid' . Hoffnung, die Abfrage oben korrigierend löst Ausnahme.

+0

Danke ... das löste das Problem ....... –

Verwandte Themen