微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – org.hibernate.hql.internal.ast.QuerySyntaxException:未映射[来自Team]

我正在研究一些Spring MVC CRUD应用程序.有一些奇怪的问题:

>配置类:

package sbk.spring.simplejc.config;

import java.util.Properties;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionfactorybean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.JstlView;
import org.springframework.web.servlet.view.UrlBasedViewResolver;

@Configuration //Specifies the class as configuration
@ComponentScan("sbk.spring.simplejc") //Specifies which package to scan
//@Import({DataBaseConfig.class})
@EnableTransactionManagement
@PropertySource("classpath:application.properties")
@EnableWebMvc //Enables to use Spring's annotations in the code
public class WebAppConfig extends WebMvcConfigurerAdapter{
    private static final String PROPERTY_NAME_DATABASE_DRIVER                   = "db.driver";
    private static final String PROPERTY_NAME_DATABASE_PASSWORD                 = "db.password";
    private static final String PROPERTY_NAME_DATABASE_URL                      = "db.url";
    private static final String PROPERTY_NAME_DATABASE_USERNAME                 = "db.username";

    private static final String PROPERTY_NAME_HIBERNATE_DIALECT                 = "hibernate.dialect";
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_sql                = "hibernate.show_sql";
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN    = "entitymanager.packages.to.scan";
    @Resource
    private Environment env;

    @Bean
    public DataSource dataSource() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName(env.getrequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
            dataSource.setUrl(env.getrequiredProperty(PROPERTY_NAME_DATABASE_URL));
            dataSource.setUsername(env.getrequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
            dataSource.setPassword(env.getrequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));
            return dataSource;
    }
    @Bean
    public LocalSessionfactorybean sessionFactory() {
        LocalSessionfactorybean sessionfactorybean = new LocalSessionfactorybean();
        sessionfactorybean.setDataSource(dataSource());     
        sessionfactorybean.setPackagesToScan(env.getrequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
        sessionfactorybean.setHibernateProperties(hibProperties()); 
        return sessionfactorybean;
    }   
    private Properties hibProperties() {
            Properties properties = new Properties();
            properties.put(PROPERTY_NAME_HIBERNATE_DIALECT,env.getrequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
            properties.put(PROPERTY_NAME_HIBERNATE_SHOW_sql,env.getrequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_sql));
            return properties;        
    }
    @Bean
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory().getobject());
        return transactionManager;
    }
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }
    @Bean
    public UrlBasedViewResolver setupViewResolver() {       
        UrlBasedViewResolver resolver = new UrlBasedViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);
        return resolver;
    }
}

> application.properties:

#DB properties:  
db.driver=com.microsoft.sqlserver.jdbc.sqlServerDriver 
db.url=jdbc:sqlserver://127.0.0.1:1433;databaseName=Examples 
db.username=sa
db.password=

#Hibernate Configuration:  
hibernate.dialect=org.hibernate.dialect.sqlServerDialect
hibernate.show_sql=true  
entitymanager.packages.to.scan=sbk.spring.simplejc.entity 

> @Entity类:

package sbk.spring.simplejc.entity;


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

    @Entity
    @Table(name="Team")
    public class Team {
        @Id
        @GeneratedValue
        private Integer id;
        private String name;
        private Integer rating;
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Integer getrating() {
            return rating;
        }
        public void setrating(Integer rating) {
            this.rating = rating;
        }
    }

>控制器类:

package sbk.spring.simplejc.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import sbk.spring.simplejc.service.ITeamService;


@Controller
public class TeamController {
    @Autowired
    ITeamService service;

    @RequestMapping(value="/")
    public ModelAndView goToHelloPage() {
        ModelAndView view = new ModelAndView();
        view.addobject("teamList",service.listTeams());
        return view;
    }

}

>错误堆栈跟踪:

    org.hibernate.hql.internal.ast.QuerySyntaxException: Team is not mapped [from Team]
        org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClasspersister(SessionFactoryHelper.java:180)
        org.hibernate.hql.internal.ast.tree.fromElementFactory.addfromElement(fromElementFactory.java:110)
        org.hibernate.hql.internal.ast.tree.FromClause.addfromElement(FromClause.java:93)
        org.hibernate.hql.internal.ast.HqlsqlWalker.createfromElement(HqlsqlWalker.java:324)
        org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.fromElement(HqlsqlbaseWalker.java:3420)
        org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.fromElementList(HqlsqlbaseWalker.java:3309)
        org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.fromClause(HqlsqlbaseWalker.java:706)
        org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.query(HqlsqlbaseWalker.java:562)
        org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.selectStatement(HqlsqlbaseWalker.java:299)
        org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.statement(HqlsqlbaseWalker.java:247)
        org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248)
        org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
        org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
        org.hibernate.engine.query.spi.HQLQueryPlan.createquery(AbstractSessionImpl.java:199)
        org.hibernate.internal.SessionImpl.createquery(SessionImpl.java:1777)
        sbk.spring.simplejc.dao.HibTeamDAO.listTeams(HibTeamDAO.java:23)
        sbk.spring.simplejc.service.TeamService.listTeams(TeamService.java:27)

我对这个问题一无所知.

更新

> DAO类:

package sbk.spring.simplejc.dao;

    import java.util.List;

    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Repository;
    import sbk.spring.simplejc.entity.Team;

    @Repository
    public class HibTeamDAO implements TeamDAO {    
        @Autowired
        private SessionFactory sessionFactory;
        public void addTeam(Team team) {
            sessionFactory.getCurrentSession().save(team);
        }
        public void updateTeam(Team team) {     
            sessionFactory.getCurrentSession().update(team);
        }
        @SuppressWarnings("unchecked")
        public Listcreatequery("from Team").list();
        }
        @SuppressWarnings("unchecked")
        public Team getTeamById(Integer teamID) {
            Session     session         =       sessionFactory.getCurrentSession();     
            Listcreatequery("from Team t where t.id = :teamID")
                                                .setParameter("teamID",teamID)
                                                .list();
            return listTeam.size()  > 0 ? (Team)listTeam.get(0) : null;
        } 
        public void removeTeam(Integer teamID) {
            Team team = (Team) sessionFactory.getCurrentSession().load(Team.class,teamID);
            if(team != null){
                sessionFactory.getCurrentSession().delete(team);
            }
        }
        @Override
        public Integer count() {
            return (Integer) sessionFactory.getCurrentSession().createquery("select count(t) from Team t").uniqueResult();
        }
    }

> TeamController类:

package sbk.spring.simplejc.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import sbk.spring.simplejc.service.ITeamService;


@Controller
public class TeamController {
    @Autowired
    ITeamService service;

    @RequestMapping(value="/")
    public ModelAndView goToHelloPage() {
        ModelAndView view = new ModelAndView();
        view.addobject("teamList",service.listTeams());
        return view;
    }

}

更新

现在我通过改变DAO方法摆脱了这个问题

return sessionFactory.getCurrentSession().createquery("from Team").list();

return sessionFactory.getCurrentSession().createquery("from sbk.spring.simplejc.entity.Team").list();

但是收到了另一个问题:尽管Team表中存在行,但每个查询都返回null.

更新

最后我发现了警告信息:

Feb 15,2014 7:01:05 PM org.hibernate.hql.internal.QuerySplitter concreteQueries
WARN: HHH000183: no persistent classes found for query class: from sbk.spring.simplejc.entity.Team

更新

至少我已经通过在WebAppConfig中的dataSource bean定义中添加下一行代码解决这个问题:

public LocalSessionfactorybean sessionFactory() {
    LocalSessionfactorybean sessionfactorybean = new LocalSessionfactorybean();
    sessionfactorybean.setDataSource(dataSource());     
    sessionfactorybean.setAnnotatedClasses(new Class[]{Team.class});//new row!!!
    sessionfactorybean.setPackagesToScan(env.getrequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
    sessionfactorybean.setHibernateProperties(hibProperties()); 
    return sessionfactorybean;
}   
最佳答案
在我的情况下,这是因为我没有hibernate packagesToScan属性.我知道你拥有它.可能此评论对错过它的人有用.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐