【问题标题】:Query Syntax Exception in hibernate休眠中的查询语法异常
【发布时间】:2017-04-24 08:14:54
【问题描述】:

我正在尝试使用 jersey 和 hibernate 在 java 中构建一个 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>

请帮帮我!提前谢谢!

【问题讨论】:

    标签: hibernate jersey


    【解决方案1】:

    您在查询中使用了“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() 方法进行本机查询。

    【讨论】:

      【解决方案2】:

      而不是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

      【讨论】:

      • 我改变了它,它告诉我书不是按书映射的。因此,根据互联网上的不同建议,我将其更改为“来自 Book”,以引用 Book 类,之后我收到此错误:org.hibernate.exception.SQLGrammarException: could not extract ResultSet
      • 如果你已经创建了 book.hbm.xml 然后将它添加到 hibernate.cfg.xml 中。 Regardinf ResultSet 它属于 SQL ,您在某处混合了 SQL 和 HQL。试试教程mkyong.com/tutorials/hibernate-tutorials它可能对你有帮助
      • 我使用 MySQL 时没有创建 book.hbm.xml
      • @Lilly 你能在 session.createQqery 中尝试使用select * from book 并告诉我它是否有效吗?
      • @AmitK 我试过了,我得到了:HTTP 状态 500 - org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:* 靠近第 1 行,第 8 列 [从书中选择 *]
      猜你喜欢
      • 1970-01-01
      • 2014-08-08
      • 2021-08-01
      • 2012-03-29
      • 2014-03-09
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      相关资源
      最近更新 更多