hibernate中的查询语法异常

时间:2017-04-24 08:14:54

标签: hibernate jersey

我正在尝试使用jersey和hibernate在java中构建一个Web应用程序来从数据库中检索数据。我是新手,我正面临着一个问题,即使通过阅读和在互联网上尝试不同的建议,我也无法应对。如果有人能帮助我,我真的很感激。

下面是我的完整代码和错误的完整堆栈跟踪。

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>

请帮帮我!提前谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您在查询中使用了“book”而不是“Book”(注意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

提示:请勿在 SELECT 中使用*。因为HQL。

您可以使用createSQLQuery()方法进行本机查询。