当前位置: 首页 > 知识库问答 >
问题:

错误:org.hibernate.hql.internal.ast.查询语法异常,帮助我?

傅长恨
2023-03-14

我的项目有问题。当我浏览<代码>http://localhost:8080/user/form在直接http://localhost:8080/user/list显示列表用户,然后出现以下错误:

Hibernate:插入userdat(密码、生日、年龄、性别、用户名)值s(?、?、?、?、?)2016年3月25日上午5:05:04,组织。冬眠发动机jdbc。spi。SqlExceptionHelper$Standar dWarningHandler logWarning警告:SQL警告代码:10000,SQLState:01J01 2016年3月25日5:05:04 AM org。冬眠发动机jdbc。spi。SqlExceptionHelper$Standar dWarningHandler logWarning警告:未创建数据库“D:\PROJECTSPRING\userdb”,而是与现有数据库建立了连接。2016年3月25日上午5:05:04,组织。冬眠hql。内部的QueryTranslatorFactoryInitiaat或initiateService信息:hh000397:使用ASTQueryTranslatorFactoryHibernate:选择user0\u。用户名为username1\u 0\u,user0\u。密码为password2\u0\u,user0\u。生日为生日3\u 0\u,用户0\u。年龄为4_0_,用户0_。性别为gen der5\u 0_来自userdat user0\u2016年3月25日上午5:05:04 org。冬眠发动机jdbc。spi。SqlExceptionHelper LogExceptions警告:SQL错误:20000,SQLState:22005 2016年3月25日上午5:05:04。冬眠发动机jdbc。spi。SqlExceptionHelper LogExceptions错误:试图从“VARCHAR”类型的数据值中获取“byte[]”类型的数据值。[警告]组织。springframework。网状物util。NestedServletException:请求处理失败;嵌套异常为org。冬眠例外DataException:无法在组织上执行查询。springframework。网状物servlet。FrameworkServlet。org上的processRequest(Frame-workServlet.java:973)。springframework。网状物servlet。FrameworkServlet。javax上的doGet(FrameworkServl et.java:852)。servlet。http。HttpServlet。服务(HttpServlet.java:687)。springframework。网状物servlet。FrameworkServlet。服务(FrameworkSer

这里的文件CustomContextLoaderListener.java

public class CustomContextLoaderListener extends ContextLoaderListener{

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // TODO Auto-generated method stub
        System.out.println("hibernate shutdown database");
        try {
            DriverManager.getConnection("jdbc:derby:D:/PROJECTSPRING/userdb;shutdown=true");
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("\n Spring-MVC application destroyed \n");
        super.contextDestroyed(event);

    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        // TODO Auto-generated method stub
        System.out.println("\n Spring-MVC application inited \n");
        try {
            createTable();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        super.contextInitialized(event);
    }

    public void createTable() throws SQLException{
        try {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            Connection connection = DriverManager.getConnection("jdbc:derby:D:/PROJECTSPRING/userdb;create=true");
            createTableNotExist(connection,"userdat", "create table userdat"
                    + "(username varchar(1000) primary key,"
                    + "password varchar(1000),birthday date,"
                    + "age integer,gender varchar(100))");
//          createTableNotExist(connection,"subject","create table subject"
//                  + "(id bigint primary key generated always as identity(start with 1,increment by 1),"
//                  + "title varchar(1000),student integer,score integer)" );
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    public void createTableNotExist(Connection connection,
            String tableName,String createTableSQL) throws SQLException{
        DatabaseMetaData dbmd = connection.getMetaData();
        ResultSet rs = dbmd.getTables(null, null,tableName.toUpperCase(), null);
        if (rs.next()){
            System.out.println("Table" + rs.getString("TABLE_NAME") + "already exists");
            return;

        }
        System.out.println("anh yeu em");
        Statement statement = connection.createStatement();
        statement.execute(createTableSQL);
        System.out.println("\n\n executed" + createTableSQL + "\n\n");
        statement.close();
    }


}

这里是文件UserRestServiceController。java

@Controller
public class UserRestServiceController {
    @Autowired
    private UserDao userDao;
    @Autowired
    private View jsonView;
    @RequestMapping(value="/user/form",method = RequestMethod.GET)
    public ModelAndView user() {
//      System.out.println("anh yeu em ");
        ModelAndView model = new ModelAndView("UserForm", "User", new User());

        model.addObject("allgender", Gender.values());

        return model;
    }

    @RequestMapping(value="/user/save", method = RequestMethod.POST)
    public ModelAndView saveUser(@ModelAttribute("User") User user,BindingResult result){

        ModelAndView model = new ModelAndView();
        System.out.println("anh yeu em ");
        if (result.hasErrors()){
            model = new ModelAndView("UserForm","User",user);
            model.addObject("errors",result);
            return model;
        }
        userDao.save(user);
        model = new ModelAndView("redirect:/user/list");
        return model;

    }

    @RequestMapping(value="/user/list",method = RequestMethod.GET)
    public ModelAndView listUser(){
        ModelAndView model = new ModelAndView();
        List<User> listUser = userDao.listUsers();
        model = new ModelAndView("UserList","Users",listUser);
        return model;
    }
    @RequestMapping(value="/user/json/{username}")
    public ModelAndView loadUser(@PathVariable("username")String name){
        return new ModelAndView(jsonView,"data",userDao.loadUser(name));
    }
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));

    }


}

这里是fileUserDaoImpl。java

@Repository
public class UserDaoImpl implements UserDao{
    @Autowired
    public LocalSessionFactoryBean sessionFactory;


    @Override
    public void save(User user) {
        // TODO Auto-generated method stub
        Session session = sessionFactory.getObject().openSession();
        session.save(user);
        session.flush();
        session.close();

    }

    @Override
    public void update(User user) {
        // TODO Auto-generated method stub

    }

    @Override
    public List<User> listUsers() {
        // TODO Auto-generated method stub
        Session session = sessionFactory.getObject().openSession();
        Query query = session.createQuery("from User");
        return (List<User>)query.list();
    }

    @Override
    public void delete(User user) {
        // TODO Auto-generated method stub
        Session session = sessionFactory.getObject().openSession();
        session.delete(user);

    }

    @Override
    public User loadUser(String username) {
        // TODO Auto-generated method stub
        Session session = sessionFactory.getObject().openSession();
        Query query = session.createQuery("from User "
                + "where username = :user_name");
        query.setParameter("user_name",username);
        return (User) query.uniqueResult();
    }


}

这里是文件<代码>用户。java

@Entity
//@Table(name = "user",uniqueConstraints={@UniqueConstraint(columnNames="username")})
public class User {
//  @Column(name = "gender", nullable = false)
//  @Enumerated(EnumType.STRING)
    public Gender getGender() {
        return gender;
    }
    public void setGender(Gender gender) {
        this.gender = gender;
    }
//  @Id
//  @GeneratedValue(strategy = GenerationType.IDENTITY)
//  @Column(name = "username", unique = true, nullable = false)
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
//  @Column(name = "password", nullable = false)
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
//  @Column(name = "birthday", nullable = false)
    public Date getBirthDay() {
        return birthDay;
    }

    public void setBirthDay(Date birthDay) {
        this.birthDay = birthDay;
    }
//  @Column(name="age", nullable = false)
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    private String userName;
    private String passWord;
    private Date birthDay;
    private Integer age;
    private Gender gender;


}

这里文件Gender.java

public enum Gender {
    MALE("Male"),
    FEMALE("Female"),
    OTHER("Other");
    private String name;

    private Gender(String name) {
        this.name = name;
    }

    public String getGender(){
        return this.name;
    }

在这里文件User.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="edu.java.spring.service.user.model.User" table="userdat">
        <id name="userName" column="username"/>
        <property name="passWord" column="password"/>
        <property name="birthDay"  column="birthday"/>
        <property name="age"  column="age"/>
        <property name="gender" column="gender" />

    </class>
</hibernate-mapping>

共有2个答案

葛浩阔
2023-03-14

当您使用Hibernate编写select语句时,您可以在HQL中编写它,但不能在SQL中编写。它们之间的主要区别之一是,在HQL中编写类名和字段名,在sql中使用表名和列名。

实体的类名很可能是User,表名是userdat。因此,正确的HQL语句应该是:来自用户(大写U!)而不是来自userdat的

@Override
public List<User> listUsers() {
    // TODO Auto-generated method stub
    Session sesshtml" target="_blank">ion = sessionFactory.getObject().openSession();
    Query query = session.createQuery("from User");
    return (List<User>)query.list();
}

顺便说一句,对于公共用户loadUser(字符串用户名)

根据你修改过的问题(顺便说一句,如果这次修改改变了问题的性质,下次提出一个新问题,而不是改变旧问题)

首先让我声明,我想知道现在仍有人在使用hbm。xml文件而不是注释,但也许你有一些很好的理由。。。

当我比较hbm时。带(注释掉的)注释的xml,只有一件事可能会导致像您的once这样的问题:枚举。在注释中,枚举通过其名称(string/varchar)映射,但在hbm中。xml它通过其序号(整数)进行映射。所以试试看。检查用于枚举的列是否为整数列,如果不是,则将其设为整数列。如果可以/不想更改列类型,则需要更改映射。根据谷歌的一些研究,用xml通过名称映射一个枚举是很奇怪的:(重要的一点是,它是varchar的内部表示!)

<property name="gender" length="30">
   <type name="org.hibernate.type.EnumType">
      <param name="enumClass">full.qualifiey.name.for.Gender</param>
      <param name="type">12</param>
   </type>
</property>
令狐和裕
2023-03-14

您需要将表userdat映射到您的User实体才能进行HQL查询。映射后,您就可以执行

Query query = session.createQuery("from User");

看一看这个例子,Hibernate文档部分介绍映射。

 类似资料:
  • 我在执行查询时收到错误。错误是: org.hibernate.hql.internal.ast.查询同步异常:意外令牌:第1行,第239列附近的组[SELECTj.orderDate, MAX(j.endTime), MIN(j.startTime)fromfr.thelem.timesbatch.dao.entities.JobExecEntity j WHEREj.name=?0 ANDTO_

  • 问题内容: 尝试更新对象时出现以下异常: org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例-在刷新之前保存该瞬态实例:...... 谁能帮忙??? 我要更新的对象在映射文件中将’lazy’属性设置为false。似乎hibernate状态希望我在刷新更新之前保存子对象??? 编辑(添加): 问题答案: 应用程序处于Spring环境中。修复:

  • 我有一个查询,其中连接了两个实体java(表)Command和User。我用左连接创建sql-hql查询,得到一个org.hibernate.hql.ast。QuerySyntaxException:意外的标记错误,我认为我的左连接语法和第二个选择有问题。我的实体 } } 我的hql查询 我不知道我的hql查询有什么问题。我在 hql 查询中使用实体 Java。任何人都可以告诉我如何用良好的语法h

  • 问题内容: 我正试图消除我的SQL技能,并需要以下查询的帮助。我当前使用的数据库是mysql。 我想检索所有同时分配了’tag2’和’tag4’的抽认卡。根据现有表的内容(如以下摘录所示),查询应返回两行:FlashCard_ID 1和2。 我将如何制定此查询?自从我不得不做这样的事情已经有一段时间了。 问题答案:

  • 我有3张桌子 许可证中的CREATED_AT是一个日期(非空)字段。 表根据同名主键/外键进行关联;客户可以拥有0个或多个许可证,每个许可证都有一个版本。 我想从这些表格中得到: 客户的名字、姓氏和创建的最后一个许可证的release\u id(根据许可证中的created\u AT字段查找最后一个),如果有。 对于这个问题,我使用了以下查询: 这似乎有效,但我问是否有人可以证实我这一点,或者是否