我想使用Hibernate查询语言执行存储过程调用,并尝试这样做



这是我用来调用Customer类的主要方法

 public class HQLMain {
    //  public static void usingHibernateQuery(){
    //      SessionFactory sf = HibernateUtil.sf;
    //      Session session = sf.openSession();
    //      //Query query =session.createQuery("from Customer");
    //      Query query =session.getNamedQuery("selectName");
    //      query.setString("name", "master");  
    //
    //      List<Customer> customers = query.list();
    //      customers.forEach(customer-> System.out.println(customer.getName()));
    //  }
        public static void usingStoredProcedure(){
            SessionFactory sf = HibernateUtil.sf;
            Session session = sf.openSession();
            //Query query =session.createQuery("from Customer");
            Query query =session.getNamedQuery("callCustomerStoredProc");
            query.setString("name", "master");  
            List<Customer> customers = query.list();
            customers.forEach(customer-> System.out.println(customer.getName()));
        }
        public static void main(String[] args) {
        //usingHibernateQuery();
            usingStoredProcedure();
        }

这是作为实体使用的类,这里命名为存储过程,请帮助使用hibernate做这个存储过程调用,我不知道在java中使用存储过程。我想知道当我给定的名称="callCustomerStoredProc",并从主要方法调用这个不工作,你能让我知道

    package org.jnit.domain;
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
    import javax.persistence.CascadeType;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.NamedNativeQueries;
    import javax.persistence.NamedNativeQuery;
    import javax.persistence.NamedQueries;
    import javax.persistence.NamedQuery;
    import javax.persistence.OneToMany;
    import javax.persistence.OneToOne;
    import javax.persistence.OrderColumn;
    import javax.persistence.Table;
    import org.hibernate.annotations.LazyCollection;
    import org.hibernate.annotations.LazyCollectionOption;
    //@NamedQueries(value={@NamedQuery(name="selectName",query="from Customer where name= :name")})
    @Entity
    @Table(name = "customer")
    @NamedNativeQueries(value={@NamedNativeQuery(name="callCustomerStoredProc",query="call fetchCustomers(:name)",resultClass=Customer.class)})
    public class Customer implements Serializable {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue
        private int customerId;
        private String name;
        private String street;
        private String city;
        private String state;
        private String country;
        private String zipCode;
        @OneToOne(cascade = CascadeType.ALL, mappedBy = "customer", optional = true)
        private PhoneInfo phoneinfo;
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "customer")
        @OrderColumn(name="idx")
        @LazyCollection(LazyCollectionOption.EXTRA)
        private List<Order> ordersplaced = new ArrayList<Order>();
        public List<Order> getOrdersplaced() {
            return ordersplaced;
        }
        public void setOrdersplaced(List<Order> ordersplaced) {
            this.ordersplaced = ordersplaced;
        }
        public PhoneInfo getPhoneInfo() {
            return phoneinfo;
        }
        public void setPhoneInfo(PhoneInfo phoneInfo) {
            this.phoneinfo = phoneInfo;
        }
        public int getCustomerId() {
            return customerId;
        }
        public void setCustomerId(int customerId) {
            this.customerId = customerId;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getStreet() {
            return street;
        }
        public void setStreet(String street) {
            this.street = street;
        }
        public String getCity() {
            return city;
        }
        public void setCity(String city) {
            this.city = city;
        }
        public String getState() {
            return state;
        }
        public void setState(String state) {
            this.state = state;
        }
        public String getCountry() {
            return country;
        }
        public void setCountry(String country) {
            this.country = country;
        }
        public String getZipCode() {
            return zipCode;
        }
        public void setZipCode(String zipCode) {
            this.zipCode = zipCode;
        }
    }

我得到以下错误:

 Hibernate: call fetchCustomers(?)
    Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not extract ResultSet
        at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:80)
        at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
        at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:91)
        at org.hibernate.loader.Loader.getResultSet(Loader.java:2066)
        at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1863)
        at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839)
        at org.hibernate.loader.Loader.doQuery(Loader.java:910)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355)
        at org.hibernate.loader.Loader.doList(Loader.java:2554)
        at org.hibernate.loader.Loader.doList(Loader.java:2540)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)
        at org.hibernate.loader.Loader.list(Loader.java:2365)
        at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:353)
        at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1873)
        at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:311)
        at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:141)
        at org.jnit.main.HQLMain.usingStoredProcedure(HQLMain.java:31)
        at org.jnit.main.HQLMain.main(HQLMain.java:37)
    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: PROCEDURE demo.fetchCustomers does not exist
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
        at com.mysql.jdbc.Util.getInstance(Util.java:381)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2648)
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077)
        at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2228)
        at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82)
        ... 15 more

验证用于创建连接对象的用户id是否具有执行上述过程的权限

相关内容

最新更新