2016-01-29 53 views
1

我在得到適當的結果criteria.uniqueResult()後引發了異常Quote。用途查詢 - 從表中獲取隨機結果從DB甲骨文援引「無法在Hibernate Criteria中提取ResultSet

org.hibernate.exception.SQLGrammarException:在org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java不能提取的ResultSet : 80) 在org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) 在org.hibernate作爲。 engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:91) at org.hibernate.loader.Loader.loader.getResultSet(Loader.java:2065) at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1862) at org.hibernate.loader.Loader.executeQueryStatement(Loader。 java:1838) at org.hibernate.loader.Loader.doQuery(Loader.java:909) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354) at org.hibernate.loader.Loader。 doList(Loader.java:2553) at org.hibernate.loader.Loader.doList(Loader.java:2539) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2369) at org.hibernate。 loader.Loader.list(Loader.java:2364) at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:126) a t org.hibernate.internal.SessionImpl.list(SessionImpl.java:1682) at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:380) at org.hibernate.internal.CriteriaImpl.uniqueResult(CriteriaImpl.java :402) 在ua.com.goit.gojava7.kikstarter.dao.database.QuoteDaoDbImpl.getRandomQuote(QuoteDaoDbImpl.java:42) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法) 在sun.reflect.NativeMethodAccessorImpl。在org.springframework.aop的java.lang.reflect.Method.invoke(Method.java:601) 處調用(NativeMethodAccessorImpl.java:57) (在DelegatingMethodAccessorImpl.java:43) 。 support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302) at org.springfra mework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 在org.springframework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation (TransactionInterceptor.java:99) 在org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 在org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 在有機.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)$ Proxy48.getRandomQuote(Unknown Source) at ua.com.goit.gojava7.kikstarter.controller.servlet.SelectoinCategories.doGet(SelectoinCategories.java:43) at javax.servlet.http。 HttpServlet.service(HttpServlet.java:621) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve。的java:222) 在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 在org.apache。 catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve。的java:953) 在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 在org.apache。 coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) at org.apache.coyot e.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:589) at org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:312) at java.util.concurrent.ThreadPoolExecutor.runWorker( ThreadPoolExecutor.java:1145) 在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:615) 在java.lang.Thread.run(Thread.java:722)

類QuoteDaoDbImpl

@Repository 
public class QuoteDaoDbImpl implements QuoteDao { 

    private static final String SELECT_RANDOM_QUOTE = "SELECT * FROM (SELECT * FROM quotes ORDER BY DBMS_RANDOM.VALUE) WHERE rownum = 1"; 

    @Autowired 
    private SessionFactory sessionFactory; 

    @Transactional 
    @Override 
    public Quote getRandomQuote() { 
     Session session = sessionFactory.getCurrentSession(); 

     Criteria criteria = session.createCriteria(Quote.class); 
     criteria.add(Restrictions.sqlRestriction(SELECT_RANDOM_QUOTE)); 
     criteria.setMaxResults(1); 

     Quote quote = (Quote) criteria.uniqueResult(); 
     session.close(); 

     return quote; 
    } 
} 

類SelectoinCategories

@WebServlet("/categories") 
public class SelectoinCategories extends HttpServlet { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    @Autowired 
    private QuoteDao quoteDao; 

    @Autowired 
    private CategoryDao categoryDao; 

    public void init() throws ServletException { 

     SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, getServletContext()); 

    } 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

     Quote quote = quoteDao.getRandomQuote(); 
     List<Category> categories = categoryDao.getAll(); 

     request.setAttribute("content", quote.getContent()); 
     request.setAttribute("author", quote.getAuthor()); 
     request.setAttribute("categories", categories); 
     request.getRequestDispatcher("WEB-INF/jsp/categories.jsp").forward(request, response); 

    } 
} 

類報價

@Entity 
@Table(name = "qoutes") 
public class Quote { 

    @Id 
    @SequenceGenerator(name = "SEQ_GEN", sequenceName = "seq_id", allocationSize = 10) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN") 
    private int id; 

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

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

    public Quote() { 
    } 

    public Quote(String content, String author) { 
     this.content = content; 
     this.author = author; 
    } 

    public int getId() { 
     return id; 
    } 

    public String getContent() { 
     return content; 
    } 

    public String getAuthor() { 
     return author; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public void setContent(String quoteContent) { 
     this.content = quoteContent; 
    } 

    public void setAuthor(String quoteAuthor) { 
     this.author = quoteAuthor; 
    } 

    public String toString() { 
     return "ID: " + id + "; Content: " + content + "; Author: " + author; 
    } 

} 

錶行情

CREATE TABLE quotes 
(
id INTEGER NOT NULL, 
content VARCHAR2(500) NOT NULL, 
author VARCHAR2(100) NOT NULL 
); 
+0

其SQL語法異常 - 在查詢瀏覽器中運行SQL查詢,確保它能正常工作。 –

+0

@Subhrajyoti在SQL Plus查詢返回正確的結果Majumder,我檢查。 – Vladimir

+0

[Hibernate Criteria API:得到n個隨機行]可能重複(http://stackoverflow.com/questions/2810693/hibernate-criteria-api-get-n-random-rows) – FGreg

回答

0

修改嘗試

private static final String SELECT_RANDOM_QUOTE = 
    "SELECT id, content, author FROM 
    (SELECT * FROM quotes ORDER BY DBMS_RANDOM.VALUE) as quotes WHERE rownum = 1"; 
+0

我試過了。不工作。 – Vladimir

+0

@sunysen我在SQL Plus中試過了你的版本查詢。我得到路徑查詢錯誤'爲qoutes'。在SQL Plus中沒有'as qoutes'查詢工作。我也檢查了我的versoin查詢 - 這是工作,我隨機qoute。你還有什麼想法嗎?謝謝。 – Vladimir

相關問題