2015-03-30 2 views
2

В моем приложении Spring 4 У меня есть проблема с названием родного запроса:HibernateException: Ошибки в именованных запросов: FindPostWithComments

@NamedNativeQuery(name = "FindPostWithComments", query = 

    " SELECT * FROM (" 
+ "  SELECT p.*, " 
+ "  MATCH (description) AGAINST ('text') AS score " 
+ "  FROM posts as p" 
+ "  WHERE MATCH (description) AGAINST ('text') > 0 " 
+ "  LIMIT 0, 10 " 
+ " ) p LEFT JOIN (" 
+ "  SELECT c.*, " 
+ "   @rownumber := CASE WHEN @post_id = post_id THEN @rownumber + 1 ELSE 1 END AS n, " 
+ "   @post_id := post_id " 
+ "  FROM comments c, " 
+ "  (SELECT @rownumber := 0, @post_id := 0) r " 
+ "  WHERE MATCH (content) AGAINST ('text') > 0 " 
+ "  ORDER BY c.last_edited DESC, post_id DESC " 
+ " ) c ON p.post_id = c.post_id " 
+ " WHERE c.post_id IS NULL OR n BETWEEN 1 and 3 " 
+ " ORDER BY score DESC " 

, resultSetMapping = "PostWithComments") 

@SqlResultSetMappings({ 
    @SqlResultSetMapping(
     name = "PostWithComments", 
     entities = { 
      @EntityResult(entityClass = Post.class, fields = { 
        @FieldResult(name = "id", column = "p.post_id"), 
        @FieldResult(name = "userId", column = "p.user_id"), 
        @FieldResult(name = "type", column = "p.type_id"), 
        @FieldResult(name = "description", column = "p.description"), 
        @FieldResult(name = "link", column = "p.link"), 
        @FieldResult(name = "dateCreated", column = "p.date_created"), 
        @FieldResult(name = "lastEdited", column = "p.last_edited"), 
        @FieldResult(name = "totalVotes", column = "p.total_votes"), 
        @FieldResult(name = "totalComments", column = "p.total_comments")     
       } 
      ), 
      @EntityResult(entityClass = Comment.class, fields = { 
        @FieldResult(name = "id", column = "c.comment_id"), 
        @FieldResult(name = "post", column = "c.post_id"), 
        @FieldResult(name = "userId", column = "c.user_id"), 
        @FieldResult(name = "dateCreated", column = "c.date_created"), 
        @FieldResult(name = "lastEdited", column = "c.last_edited"), 
        @FieldResult(name = "content", column = "c.content"), 
        @FieldResult(name = "totalVotes", column = "c.total_votes") 
       }    
      )   
     } 
    ) 
}) 

Это дает сбой при запуске приложения с исключением следующего:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Errors in named queries: FindPostWithComments 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1566) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:747) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4728) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5162) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1399) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.hibernate.HibernateException: Errors in named queries: FindPostWithComments 
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:545) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1859) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:845) 
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844) 
    at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:152) 
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:338) 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1625) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562) 
    ... 21 more 

Какова возможная причина?

Этот запрос отлично работает из Workbench MySQL.

ответ

1

Я нашел причину самостоятельно. Мне нужно добавить двойные косые черты перед каждым знаком двоеточия, поэтому окончательный запрос должен выглядеть так:

" SELECT * FROM (" 
+ "  SELECT p.*, " 
+ "  MATCH (description) AGAINST (:term) AS score " 
+ "  FROM posts as p" 
+ "  WHERE MATCH (description) AGAINST (:term) > 0 " 
+ "  LIMIT 0, 10 " 
+ " ) p LEFT JOIN (" 
+ "  SELECT c.*, " 
+ "   @rownumber \\:= CASE WHEN @post_id = post_id THEN @rownumber + 1 ELSE 1 END AS n, " 
+ "   @post_id \\:= post_id " 
+ "  FROM comments c, " 
+ "  (SELECT @rownumber \\:= 0, @post_id \\:= 0) r " 
+ "  WHERE MATCH (content) AGAINST (:term) > 0 " 
+ "  ORDER BY c.last_edited DESC, post_id DESC " 
+ " ) c ON p.post_id = c.post_id " 
+ " WHERE c.post_id IS NULL OR n BETWEEN 1 and 3 " 
+ " ORDER BY score DESC " 
+0

Ничего себе, как вы это поняли? –

Смежные вопросы