简体   繁体   中英

getting exception when retrieving data from database org.hibernate.hql.ast.QuerySyntaxException:

Iam new to JPA, iam trying to create EJB 3.0 + JPA (hibernate) application. When iam persisting data into database getting below exception.

sessionBean method:

    @PersistenceContext
    private EntityManager em;
    public void showCustDetails(){
        //System.out.println(em.getProperties());
        //EntityManager em = emf.createEntityManager();
        List customer = em.createQuery("select c from CUSTOMER c").getResultList();
        System.out.println("List Size:::"+ customer.size());
        for(Object c:customer){
            Customer customers = (Customer) c;
            System.out.println("Name ::::" + customers.getName() + "::customer id ::"+customers.getCustomer_id()+"::email::"+customers.getEmail_id()+"::address::"+customers.getAddress()+
                    ":::ph number::"+customers.getPhNumber());
        }

}


Customer class(entity class)

package retail.model.vo;

import java.io.Serializable;

import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionManagement;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import static javax.ejb.TransactionManagementType.BEAN;
@Entity
@Table(name = "CUSTOMER")
//@TransactionAttribute(value=REQUIRED)

public class Customer  implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 5256938732963606407L;
    private int customer_id;
    private String name;
    private String address;
    private String email_id;
    private int phNumber;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "customer_id")
    public int getCustomer_id() {
        return customer_id;
    }

    public void setCustomer_id(int customer_id) {
        this.customer_id = customer_id;
    }

    @Column(name = "Name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Column(name = "addres")
    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Column(name = "email_add")
    public String getEmail_id() {
        return email_id;
    }

    public void setEmail_id(String email_id) {
        this.email_id = email_id;
    }

    @Column(name = "ph_number")
    public int getPhNumber() {
        return phNumber;
    }

    public void setPhNumber(int phNumber) {
        this.phNumber = phNumber;
    }

     public String validate(){
          if(name!=null && name!=""){
          System.out.println("chandan");
          return "viewCustomerDetails";
          }
          else{
          return "viewCustomerDetails";
          }
          }
}


persistence.xml

    <persistence-unit name="RetailUnit" >
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <!-- the JNDI data source-->
        <jta-data-source>java/customer</jta-data-source>
        <properties> 
            <!-- if this is true, hibernate will print (to stdout) the SQL it executes, 
                so you can check it to ensure it's not doing anything crazy
                 <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.ClientDriver"/>
                 <property name="hibernate.connection.url" value="jdbc:derby://localhost:1527/company;create=true" />
              <property name="hibernate.connection.username" value="user" />
              <property name="hibernate.connection.password" value="123" /> -->
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <!-- since most database servers have slightly different versions of the 
                SQL, Hibernate needs you to choose a dialect so it knows the subtleties of 
                talking to that server -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect" />
            <property name="hibernate.archive.autodetection" value="class"/>
            <!-- this tell Hibernate to update the DDL when it starts, very useful 
                for development, dangerous in production -->
            <property name="hibernate.hbm2ddl.auto" value="create" />
        </properties>
    </persistence-unit>
</persistence>


Exception

Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: CUSTOMER is not mapped [select c from CUSTOMER c]
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1376)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1317)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:280)
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.createQuery(EntityManagerWrapper.java:436)
    at retail.ejb.service.CustomerSessionBeanImpl.showCustDetails(CustomerSessionBeanImpl.java:47)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5388)
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370)
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5360)
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5348)
    at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:206)
    ... 51 more


Please anyone suggest on this.

Edit Out Put

INFO: Name ::::sdsdfsd::customer id ::0::email::sdsdfdsdssfd::address::sdfsdsdsdsdf:::ph number::0
INFO: Hibernate: 
    insert 
    into
        CUSTOMER
        (customer_id, addres, email_add, Name, ph_number) 
    values
        (default, ?, ?, ?, ?)
INFO: Hibernate: 

values
    identity_val_local()

INFO: Hibernate: 
    select
        customer0_.customer_id as customer1_0_,
        customer0_.addres as addres0_,
        customer0_.email_add as email3_0_,
        customer0_.Name as Name0_,
        customer0_.ph_number as ph5_0_ 
    from
        CUSTOMER customer0_
INFO: List Size:::1
INFO: Name ::::sdsdfsd::customer id ::1::email::sdsdfdsdssfd::address::sdfsdsdsdsdf:::ph number::0


在此处输入图片说明

The name of the entity must be spelled exactly as defined by the class name, independent of the table mapping, in your case it would be Customer .

To be exact, the String corresponds to the output of myEntity.getClass().getSimpleName();

EDIT: JPQL != SQL

More often than not you will not get the same results (if any) using the same JPQL query with an SQL editor and vice versa. While SQL uses table identifiers, JPQL uses entities, corresponding to classes.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM