2011-09-28 15 views
7

ho usato NanedQueries (come segue) nel mio progetto JPA EclipseLink come provider di persistenza: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") 
}) 

Ma dopo che ho cambiato Hibernate come il mio provider di persistenza, ottengo il seguente errore:

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

Uso Hibernate 3.2.5 (dialetto MySQL)

+0

Puoi condividere il tuo persistence.xml? – nowaq

+4

Puoi mostrare più dell'eccezione che viene lanciata? Vedo "select" alla fine dell'eccezione, forse viene mostrata l'intera query o qualcos'altro di pertinente. – siebz0r

+0

Prova a vedere negli argomenti che stai passando attraverso la query, forse c'è qualcosa di sbagliato nel suo valore, esegui il debug del tuo codice o aggiungi un syso prima di eseguire la query. –

risposta

1

Non avere la configurazione esatta rende difficile. Ma non ho avuto un problema con Hibernate 3.2.5.GA

ho creato il seguente oggetto di accesso di dominio: classe

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

e test:

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

mio hibernate-annotazione. file di hbm.xml è la seguente:

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

Puoi provare questo nel proprio ambiente e fammi sapere come si ottiene su

Problemi correlati