2017-04-24 97 views
1

我想在java中使用jersey和hibernate從數據庫檢索數據來構建一個web應用程序。我是hibernate的新手,我面臨的問題是即使通過在互聯網上閱讀和嘗試不同的建議,我也無法應對。如果有人能幫助我,我將不勝感激。休眠中的查詢語法異常

下面是我的完整代碼和錯誤的完整堆棧跟蹤。

BookResource.java

import java.util.List; 



import javax.ws.rs.Consumes; 
import javax.ws.rs.DELETE; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.PUT; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.MultivaluedMap; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.core.Response.Status; 

import com.bookstrore.model.Book; 
//import com.ebook.model.User; 
//import com.ebook.repository.BookRepository; 
import com.bookstrore.repository.BookRepositoryStub; 


@Path("books") 
public class BookResource { 
    //private BookRepository bookRepository=new BookRepositoryStub(); 

    @GET 
    @Produces("application/json") 
    public List<Book> getBook() { 
     BookRepositoryStub book = new BookRepositoryStub(); 
     List books = book.getBooks(); 
     return books; 
    } 

    @DELETE 
    @Path("{bookId}") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 
    public Response delete(@PathParam("bookId") int bookId){ 
     BookRepositoryStub book = new BookRepositoryStub(); 
      int count = book.delete(bookId); 
      if(count==0){ 
       return Response.status(Response.Status.BAD_REQUEST).build(); 
      } 


     return Response.ok().build(); 
    } 

    @PUT 
    @Path("{bookId}") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 
    public Response update(@PathParam("bookId") int bookId, Book bo){ 
     BookRepositoryStub book = new BookRepositoryStub(); 
     int count = book.update(bookId, bo); 
     if(count==0){ 
      return Response.status(Response.Status.BAD_REQUEST).build(); 

    } 
     return Response.ok().build(); 
    } 

    @POST 
    @Path("book") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 
    public Response createBook(Book bo){ 
     bo.setBook_title(bo.getBook_title()); 
     bo.setBook_author(bo.getBook_author()); 
     bo.setBook_description(bo.getBook_description()); 
     bo.setBook_price(bo.getBook_price()); 

     BookRepositoryStub book = new BookRepositoryStub(); 
     book.createBook(bo); 

     return Response.ok().build(); 
    } 

} 

Book.java

package com.bookstrore.model; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 

@Table(name="book") 
public class Book { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int book_id; 
    @Column 
    private String book_title; 
    @Column 
    private String book_author; 
    @Column 
    private String book_description; 
    @Column 
    private int book_price; 
    public int getBook_id() { 
     return book_id; 
    } 
    public void setBook_id(int book_id) { 
     this.book_id = book_id; 
    } 
    public String getBook_title() { 
     return book_title; 
    } 
    public void setBook_title(String book_title) { 
     this.book_title = book_title; 
    } 
    public String getBook_author() { 
     return book_author; 
    } 
    public void setBook_author(String book_author) { 
     this.book_author = book_author; 
    } 
    public String getBook_description() { 
     return book_description; 
    } 
    public void setBook_description(String book_description) { 
     this.book_description = book_description; 
    } 
    public int getBook_price() { 
     return book_price; 
    } 
    public void setBook_price(int book_price) { 
     this.book_price = book_price; 
    } 


} 

SessionUtil.java

package com.bookstrore.model; 

//import javax.imageio.spi.ServiceRegistry; 

import org.hibernate.Session; 

import org.hibernate.SessionFactory; 
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 
import org.hibernate.cfg.Configuration; 
import org.hibernate.service.ServiceRegistry; 

public class SessionUtil { 

    private static SessionUtil instance=new SessionUtil(); 
    private SessionFactory sessionFactory; 

    public static SessionUtil getInstance(){ 
      return instance; 
    } 

    //@SuppressWarnings("deprecation") 
    private SessionUtil(){ 
     Configuration configuration = new Configuration(); 
     configuration.configure("hibernate.cfg.xml"); 
     ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
       configuration.getProperties()).build(); 
     sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
     //return sessionFactory; 
     //sessionFactory = configuration.buildSessionFactory(); 
    } 

    public static Session getSession(){ 
     Session session = getInstance().sessionFactory.openSession(); 

     return session; 
    } 
} 

BookRepositoryStub.java

package com.bookstrore.repository; 

import java.util.ArrayList; 


import java.util.List; 

import org.hibernate.Transaction; 
import org.hibernate.Session; 
import org.hibernate.Query; 

import com.bookstrore.model.Book; 
import com.bookstrore.model.SessionUtil; 
//import com.pluralsight.model.User; 

public class BookRepositoryStub { 

    public void createBook(Book book) { 
     Session session = SessionUtil.getSession();   
      Transaction tx = session.beginTransaction(); 
      createBook(session,book);   
      tx.commit(); 
      session.close(); 

    } 

    private void createBook(Session session, Book bo){ 
     Book book=new Book(); 

     book.setBook_id(bo.getBook_id()); 
     book.setBook_title(bo.getBook_title()); 
     book.setBook_author(bo.getBook_author()); 
     book.setBook_description(bo.getBook_description()); 
     book.setBook_price(bo.getBook_price()); 


     session.save(book); 
    } 

    public List<Book> getBooks(){ 
     Session session = SessionUtil.getSession();  
     Query query = session.createQuery("select from book"); 
     List<Book> books = query.list(); 
     session.close(); 
     return books; 
    } 
    public int delete(int id){ 
     Session session = SessionUtil.getSession(); 
     Transaction tx = session.beginTransaction(); 
     String hql = "delete from book where id = :book_id"; 
     Query query = session.createQuery(hql); 
     query.setInteger("id",id); 
     int rowCount = query.executeUpdate(); 
     System.out.println("Rows affected: " + rowCount); 
     tx.commit(); 
     session.close(); 
     return rowCount; 
    } 

    public int update(int id, Book bo){ 
     if(id <=0) 
       return 0; 
     Session session = SessionUtil.getSession(); 
      Transaction tx = session.beginTransaction(); 
      String hql = "update book set book_title = :book_title, book_author = :book_author, book_description = :book_description, book_price = :book_price, where id = :book_id"; 
      Query query = session.createQuery(hql); 
      query.setInteger("id",id); 
      query.setString("book_title",bo.getBook_title()); 
      query.setString("book_author",bo.getBook_author()); 
      query.setString("book_description",bo.getBook_description()); 
      query.setInteger("book_price",bo.getBook_price()); 

      int rowCount = query.executeUpdate(); 
      System.out.println("Rows affected: " + rowCount); 
      tx.commit(); 
      session.close(); 
      return rowCount; 
    } 



} 

的hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
             "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
<session-factory name="hibernateSessionFactory"> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.password">behari</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/ebooks</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.show_sql">true</property> 
    <property name="hibernate.format_sql">true</property> 
<!-- <property name="hibernate.hbm2ddl.auto">create</property> --> 
    <mapping class="com.bookstrore.model.Book"/> 
</session-factory> 
</hibernate-configuration> 

完整的堆棧跟蹤:

<pre>javax.servlet.ServletException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: from near line 1, column 8 [select from book] 
    org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:487) 
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:425) 
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:383) 
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:336) 
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:223) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
</pre> 
     </p> 
     <p> 
      <b>root cause</b> 
      <pre>org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: from near line 1, column 8 [select from book] 
    org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:91) 
    org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:109) 
    org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:304) 
    org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:203) 
    org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158) 
    org.hibernate.engine.query.spi.HQLQueryPlan.&lt;init&gt;(HQLQueryPlan.java:131) 
    org.hibernate.engine.query.spi.HQLQueryPlan.&lt;init&gt;(HQLQueryPlan.java:93) 
    org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167) 
    org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301) 
    org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236) 
    org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1836) 
    com.bookstrore.repository.BookRepositoryStub.getBooks(BookRepositoryStub.java:42) 
    com.bookstrore.BookResource.getBook(BookResource.java:33) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    java.lang.reflect.Method.invoke(Unknown Source) 
    org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) 
    org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144) 
    org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161) 
    org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:205) 
    org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) 
    org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) 
    org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) 
    org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) 
    org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326) 
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
    org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    org.glassfish.jersey.internal.Errors.process(Errors.java:267) 
    org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) 
    org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) 
    org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) 
    org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:471) 
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:425) 
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:383) 
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:336) 
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:223) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
</pre> 

請幫幫我!先謝謝你!

回答

0

你已經在你的查詢中使用的 「書」,而不是 「書」(注意B) 。 「Book」是指用@Entity和@Table註釋的Book類。

所以,你的查詢應該是這樣的

Query query = session.createQuery("FROM Book"); // note the B 

Query query = session.createQuery("SELECT b FROM Book b"); //more declarative 

提示:不要使用*在你選擇。由於HQL。

您可以使用createSQLQuery()方法進行本機查詢。

+0

非常感謝。有效 :) – Lilly

0

,而不是低於getBooks()

Query query = session.createQuery("select from book"); 

使用

Query query = session.createQuery("from book"); 

編號:https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

+0

我改變了它,它對我說書不是通過書映射。所以,根據互聯網上的不同建議,我將它改爲「從Book」,以引用Book類,之後我得到這個錯誤:org.hibernate.exception.SQLGrammarException:無法提取ResultSet – Lilly

+0

如果您已經創建了書籍.hbm.xml然後將其添加到hibernate.cfg.xml。 Regardinf ResultSet它是SQL,你正在混合某處SQL和HQL。 嘗試一個教程http://www.mkyong.com/tutorials/hibernate-tutorials/它可以幫助你 – gladiator

+0

我還沒有創建book.hbm.xml,因爲我正在使用MySQL – Lilly