Java Hibernate的NamedQueries问题

Java Hibernate的NamedQueries问题,java,mysql,hibernate,jpa,eclipselink,Java,Mysql,Hibernate,Jpa,Eclipselink,我在JPA项目Eclipselink中使用NanedQueries(如下所示)作为持久性提供者: @Entity @Table(name = "login") @NamedQueries({ @NamedQuery(name = "Login.random", query = "SELECT l FROM Login l WHERE l.pk = :randomPk"), @NamedQuery(name = "Login.max", query = "SELECT MAX(l.

我在JPA项目Eclipselink中使用NanedQueries(如下所示)作为持久性提供者:

@Entity
@Table(name = "login")
@NamedQueries({
    @NamedQuery(name = "Login.random", query = "SELECT l FROM Login l WHERE l.pk = :randomPk"),
    @NamedQuery(name = "Login.max", query = "SELECT MAX(l.pk) FROM Login l")
})
但在我将Hibernate更改为持久性提供程序后,出现以下错误:

java.lang.IllegalArgumentException: org.hibernate.QueryException: unexpected char: '{' [SELECT...

我使用的是Hibernate 3.2.5(MySQL方言)

没有精确的配置使得这很困难。但是我对hibernate 3.2.5.GA没有任何问题

我创建了以下登录域对象:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import java.io.Serializable;

@Entity
@Table(name = "login")
@NamedQueries({
        @NamedQuery(name = "Login.random", query = "select l FROM Login l WHERE l.pk = :randomPk"),
        @NamedQuery(name = "Login.max", query = "select max(l.pk) from Login l")
})
public class Login implements Serializable {

    private Long pk;
    private String username;

    public Login() {}

    public Login(Long pk, String username) {
        this.pk = pk;
        this.username = username;
    }

    @Id
    public Long getPk() {
        return pk;
    }

    public void setPk(Long pk) {
        this.pk = pk;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}
和测试等级:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import sky.sns.domain.Login;

import static org.junit.Assert.assertEquals;

public class AnnotationTest {

    private static SessionFactory sessionFactory;
    private Session session;
    private Transaction transaction;

    @BeforeClass
    public static void initialise() {
        sessionFactory = new AnnotationConfiguration().configure("/hibernate-annotation.cfg.xml").buildSessionFactory();
    }

    @Before
    public void setUp() {
        session = sessionFactory.getCurrentSession();
        transaction = session.beginTransaction();
    }

    @After
    public void tearDown() {
        transaction.rollback();
    }

    @Test
    public void createUser() {
        Login login = new Login(1L, "foo");
        session.save(login);
        session.flush();
        session.clear();
        Login persistedLogin = (Login)session.get(Login.class, 1L);
        assertEquals(login.getPk(), persistedLogin.getPk());
    }

    @Test
    public void obtainUserByIdNamedQuery() {
        Login login = new Login(1L, "foo");
        session.save(login);
        session.flush();
        session.clear();
        Login persistedLogin = (Login)session.getNamedQuery("Login.random").setLong("randomPk", 1L).uniqueResult();
        assertEquals(login.getPk(), persistedLogin.getPk());
    }

    @Test
    public void obtainMaxUserIdNamedQuery() {
        Login login = new Login(1L, "foo");
        session.save(login);
        session.flush();
        session.clear();
        Long maxId = (Long)session.getNamedQuery("Login.max").uniqueResult();
        assertEquals(login.getPk(), maxId);
    }
}
我的hibernate-annotation.hbm.xml文件如下所示:

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

<hibernate-configuration>
    <session-factory>

        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_owner</property>
        <property name="hibernate.connection.username">hibernate_owner</property>
        <property name="hibernate.connection.password">hibernate</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable 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>
        <property name="hibernate.format_sql">false</property>
        <property name="hibernate.use_sql_comments">false</property>

        <mapping class="sky.sns.domain.Login" />

    </session-factory>
</hibernate-configuration>

org.hibernate.dialogue.mysqldialogue
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/hibernate_owner
冬眠所有者
冬眠
线
org.hibernate.cache.NoCacheProvider
真的
假的
假的

您能在您的环境中尝试一下这个方法并告诉我您的进展情况吗

您能分享您的persistence.xml吗?您能展示更多抛出的异常吗?我在异常的末尾看到“select”,可能显示了整个查询或其他相关内容。尝试查看通过查询传递的参数,可能其值有问题,在执行查询之前调试代码或添加系统。如果有人帮助您,需要persistence.xml和堆栈跟踪。。张贴这两个,你会真正帮助你自己。你是否也检查了你正在使用的导入,可能有一些冲突(导入错误的东西)?