java - 从数据库检索数据时出现异常 org.hibernate.hql.ast.QuerySyntaxException :

标签 java hibernate jpa ejb-3.0

我是 JPA 新手,正在尝试创建 EJB 3.0 + JPA( hibernate )应用程序。当我将数据持久保存到数据库时出现异常。

sessionBean方法:

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

}


客户类(实体类)

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>


异常

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


请任何人对此提出建议。

编辑输出

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


enter image description here

最佳答案

实体的名称必须完全按照类名称的定义拼写,与表映射无关,在您的情况下,它将是 Customer

准确地说,String 对应于 myEntity.getClass().getSimpleName();

的输出

编辑:JPQL!= SQL

通常情况下,使用 SQL 编辑器使用相同的 JPQL 查询不会获得相同的结果(如果有),反之亦然。 SQL 使用表标识符,而 JPQL 使用对应于类的实体。

关于java - 从数据库检索数据时出现异常 org.hibernate.hql.ast.QuerySyntaxException :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16210535/

相关文章:

sql - 引用 QueryDSL 中的子查询字段

spring - Spring Data JPA 中的动态查询

java - 当变量在父类(super class)中 protected 时,子类如何将变量设为私有(private)?

java - 如何检索任何 Maven 插件的所有可能配置

java - 访问限制 : The type 'BASE64Decoder' is not API

java - 子字符串和 Vector.add 的问题

java - 如何在 Hibernate 中以单向多对一的方式离开联接表?

java - Spring boot postgresql 在安装配置上失败

java - hibernate 定义可能的列值

java - 如何阻止持久性更改数据库、JPA