java - 语法查询异常,对象无法映射

标签 java hibernate hql

所以我正在使用带有注释的 hibernate 创建一个简单的 Hello World。

//hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
        <!-- <property name="connection.url">jdbc:jtds:sqlserver://127.0.0.1:1433/ProgAp3_B</property> -->
        <property name="connection.url">jdbc:jtds:sqlserver://localhost:1433/ProgAp3_B</property>
        <property name="connection.username">username</property>
        <property name="connection.password">password</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.SQLServer2008Dialect</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">create</property>

        <!-- Names the annotated entity class -->
        <mapping class="com.Message"/>
    </session-factory>

</hibernate-configuration>

Message.java

package com;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity (name="Messages")
public class Message {
@Id @GeneratedValue
private Long id;
private String text;
@ManyToOne (cascade = CascadeType.ALL)
private Message nextMessage;

public Message() { }
public Message(String text) {
    this.text = text;
}
//geters and setters
}

HelloWorld.java

package com;

import java.util.*;

import org.hibernate.*;
import org.hibernate.cfg.Configuration;

public class HelloWorld {

    public static void main(String[] args) {
Session session = new Configuration().configure().buildSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Message message = new Message("Hello world");
session.save(message);
tx.commit();
Transaction newTransaction = session.beginTransaction();
List<Message> messages = session.createQuery("from Message m order by m.text asc").list();
System.out.println( messages.size() + " message(s) found:" );
for (Iterator<Message> iterator = messages.iterator(); iterator.hasNext();) {
    Message loaded = iterator.next();
    System.out.println(loaded.getText());
}
newTransaction.commit();
session.close();
}

}

除了第二笔交易外,一切正常。

Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: Message is not mapped [from Message m order by m.text asc]

由于 HQL 是面向对象的,所以我使用了 Message,因为它是我想要映射的类。为什么消息对象没有被映射? HQL 出了什么问题?

最佳答案

让我们讨论一下@Entity@Table

例如,我可以使用相同的名称属性值

@Entity(name = "someThing")
@Table(name = "someThing")

对于同一类我也可以有不同的名称

 @Entity(name = "someThing")
 @Table(name = "otherThing")



@Entity(name = "someThing") => this name will be used to name Entity
@Table(name = "someThing")  => this name will be used to name a table in DB

因此,在第一种情况下,您的表和实体将具有相同的名称,这将允许您在编写 HQLJPQL 时访问与实体相同名称的表。

在第二种情况下,在编写查询时,您必须使用 @Entity 中给出的名称,并且 @Table 中给出的名称将用于命名数据​​库中的表。

因此,在 HQL 中,您的 someThing 将引用数据库中的 otherThing

查询应该类似于:from Messages m order by m.text asc

关于java - 语法查询异常,对象无法映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25337075/

相关文章:

java - Hibernate 实体代理初始化

java - Synat 错误 - 表达式的类型必须是数组类型,但它解析为 String

java - 如何从 Edifact d96a .txt 文件中读取交货日期?

java - Camel 路线未在 xml 文件中解析

使用 AES SecretKey 的 Java KeyStore setEntry()

java - 使用 Spring 框架获取 org.hibernate.MappingException : Unknown entity.

java - 如何使用 Spring 4.0.6 为 Hibernate 4.3.5.Final 全局设置 FlushMode?

java - ORDER BY 使用 Criteria API

java - hibernate : unexpected token: and when comparing dates

java - 在 HQL 查询中使用 native SQL 子查询?