Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NamedQueries problem with Hibernate

I used NanedQueries (as follows) in my JPA project Eclipselink as persistence provider:

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

But after I change Hibernate as my persistence provider, I get the following error:

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

I use Hibernate 3.2.5 (MySQL dialect)

like image 241
siva636 Avatar asked Sep 28 '11 16:09

siva636


People also ask

Why we use named query in hibernate?

The hibernate named query is way to use any query by some meaningful name. It is like using alias names. The Hibernate framework provides the concept of named queries so that application programmer need not to scatter queries to all the java code.

What is named native query in hibernate?

Native query refers to actual sql queries (referring to actual database objects). These queries are the sql statements which can be directly executed in database using a database client. Similar to how the constant is defined. NamedQuery is the way you define your query by giving it a name.

Which method is used to call named SQL query in hibernate?

Hibernate Named Query XML query element is used for HQL named queries and sql-query element is used for native sql named queries. We can use return element for declaring the entity to which resultset will be mapped.


1 Answers

Not having your exact configuration makes this difficult. But I didn't have an issue with hibernate 3.2.5.GA

I created the following Login Domain object:

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

and test class:

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

My hibernate-annotation.hbm.xml file is as follows:

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

Can you try this in your environment and let me know how you get on

like image 108
Andy Mc Avatar answered Oct 19 '22 05:10

Andy Mc