2011-09-28 21 views
7

que utiliza NanedQueries (a continuación) en mi proyecto APP EclipseLink como proveedor de persistencia:NamedQueries problema con Hibernate

@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") 
}) 

Pero después de cambiar Hibernate como mi proveedor de persistencia, me sale el siguiente error:

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

Uso Hibernate 3.2.5 (dialecto MySQL)

+0

¿Puedes compartir tu persistence.xml? – nowaq

+4

¿Podría mostrar más de la excepción que se arroja? Veo "seleccionar" al final de la excepción, tal vez se muestre toda la consulta o alguna otra información relevante. – siebz0r

+0

Intente ver los argumentos que está pasando a través de la consulta, quizás haya algún problema con su valor, depure su código o agregue un syso antes de ejecutar la consulta. –

Respuesta

1

No tener su configuración exacta lo hace difícil. Pero yo no tenía un problema con 3.2.5.GA hibernación

creé el siguiente objeto de sesión de dominio: Clase

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; 
    } 
} 

y la prueba:

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); 
    } 
} 

Mi-hibernación anotación. hbm.xml archivo es el siguiente:

<?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> 

¿se puede probar esto en su entorno y que me haga saber cómo llegar en

Cuestiones relacionadas