Hibernate-hql语法总结.

本文介绍HQL查询语言的基础用法,包括查询整个映射对象的所有字段、查询单个字段、查询多个字段,并提供了如何修改查询结果返回形式的方法,如List、Map、Set及自定义类型等。此外还介绍了条件查询的具体实现。
1. 查询整个映射对象所有字段 
Java代码:
  1. //直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段      
  2.         String hql = "from Users";      
  3.         Query query = session.createQuery(hql);      
  4.               
  5.         List<Users> users = query.list();      
  6.         for(Users user : users){      
  7.             System.out.println(user.getName() + " : " + user.getPasswd() + " : " + user.getId());      
  8.         }      
  9.      
  10.  输出结果为:      
  11. name1 : password1 : 1     
  12. name2 : password2 : 2     
  13. name3 : password3 : 3    
Java代码   收藏代码
  1. //直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段     
  2.         String hql = "from Users";     
  3.         Query query = session.createQuery(hql);     
  4.              
  5.         List<Users> users = query.list();     
  6.         for(Users user : users){     
  7.             System.out.println(user.getName() + " : " + user.getPasswd() + " : " + user.getId());     
  8.         }     
  9.     
  10.  输出结果为:     
  11. name1 : password1 : 1    
  12. name2 : password2 : 2    
  13. name3 : password3 : 3    


2.查询单个字段  
Java代码  复制代码
  1. //查询单个字段      
  2.         String hql = " select name from Users";      
  3.         Query query = session.createQuery(hql);      
  4.               
  5.         List<String> list = query.list();      
  6.         for(String str : list){      
  7.             System.out.println(str);      
  8.         }      
  9. 输出结果为:      
  10. name1      
  11. name2      
  12. name3    
Java代码   收藏代码
  1. //查询单个字段     
  2.         String hql = " select name from Users";     
  3.         Query query = session.createQuery(hql);     
  4.              
  5.         List<String> list = query.list();     
  6.         for(String str : list){     
  7.             System.out.println(str);     
  8.         }     
  9. 输出结果为:     
  10. name1     
  11. name2     
  12. name3    


3.查询其中几个字段 
  
Java代码  复制代码
  1. //查询其中几个字段      
  2.         String hql = " select name,passwd from Users";      
  3.         Query query = session.createQuery(hql);      
  4.         //默认查询出来的list里存放的是一个Object数组      
  5.         List<Object[]> list = query.list();      
  6.         for(Object[] object : list){      
  7.             String name = (String)object[0];      
  8.             String passwd = (String)object[1];      
  9.                   
  10.             System.out.println(name + " : " + passwd);      
  11.         }      
  12. 输出结果为:      
  13. name1 : password1      
  14. name2 : password2      
  15. name3 : password3    
Java代码   收藏代码
  1. //查询其中几个字段     
  2.         String hql = " select name,passwd from Users";     
  3.         Query query = session.createQuery(hql);     
  4.         //默认查询出来的list里存放的是一个Object数组     
  5.         List<Object[]> list = query.list();     
  6.         for(Object[] object : list){     
  7.             String name = (String)object[0];     
  8.             String passwd = (String)object[1];     
  9.                  
  10.             System.out.println(name + " : " + passwd);     
  11.         }     
  12. 输出结果为:     
  13. name1 : password1     
  14. name2 : password2     
  15. name3 : password3    


4.修改默认查询结果(query.list())不以Object[]数组形式返回,以List形式返回 
引用
//查询其中几个字段,添加new list(),注意list里的l是小写的。也不需要导入包,这样通过query.list()出来的list里存放的不再是默认的Object数组了,而是List集合了   
        String hql = " select new list(name,passwd) from Users";   
        Query query = session.createQuery(hql);   
        //默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是List集合了   
        List<List> list = query.list();   
        for(List user : list){   
            String name = (String)user.get(0);   
            String passwd = (String)user.get(1);   
               
            System.out.println(name + " : " + passwd);   
        }   
        /**  
        输出结果为:  
         name1 : password1  
        name2 : password2  
        name3 : password3  
         */ 

5.修改默认查询结果(query.list())不以Object[]数组形式返回,以Map形式返回 
Java代码  复制代码
  1. //查询其中几个字段,添加new map(),注意map里的m是小写的。也不需要导入包,这样通过query.list()出来的list里存放的不再是默认的Object数组了,而是map集合了      
  2.         String hql = " select new map(name,passwd) from Users";      
  3.         Query query = session.createQuery(hql);      
  4.         //默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是Map集合了      
  5.         List<Map> list = query.list();      
  6.         for(Map user : list){      
  7.             //一条记录里所有的字段值都是map里的一个元素,key是字符串0,1,2,3....,value是字段值      
  8.             //如果将hql改为:String hql = " select new map(name as username,passwd as password) from Users";,那么key将不是字符串0,1,2...了,而是"username","password"了      
  9.             String name = (String)user.get("0");//get("0");是get(key),注意:0,1,2...是字符串,而不是整形      
  10.             String passwd = (String)user.get("1");      
  11.                   
  12.             System.out.println(name + " : " + passwd);      
  13.         }      
  14.         /**    
  15.         输出结果为:    
  16.          name1 : password1    
  17.         name2 : password2    
  18.         name3 : password3    
  19.          */    
Java代码   收藏代码
  1. //查询其中几个字段,添加new map(),注意map里的m是小写的。也不需要导入包,这样通过query.list()出来的list里存放的不再是默认的Object数组了,而是map集合了     
  2.         String hql = " select new map(name,passwd) from Users";     
  3.         Query query = session.createQuery(hql);     
  4.         //默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是Map集合了     
  5.         List<Map> list = query.list();     
  6.         for(Map user : list){     
  7.             //一条记录里所有的字段值都是map里的一个元素,key是字符串0,1,2,3....,value是字段值     
  8.             //如果将hql改为:String hql = " select new map(name as username,passwd as password) from Users";,那么key将不是字符串0,1,2...了,而是"username","password"了     
  9.             String name = (String)user.get("0");//get("0");是get(key),注意:0,1,2...是字符串,而不是整形     
  10.             String passwd = (String)user.get("1");     
  11.                  
  12.             System.out.println(name + " : " + passwd);     
  13.         }     
  14.         /**   
  15.         输出结果为:   
  16.          name1 : password1   
  17.         name2 : password2   
  18.         name3 : password3   
  19.          */    

6.修改默认查询结果(query.list())不以Object[]数组形式返回,以Set形式返回,但是因为Set里是不允许有重复的元素,所以:username和password的值不能相同。只需将hql改为:String hql = " select new set(name,passwd) from Users"; 

7.修改默认查询结果(query.list())不以Object[]数组形式返回,以自定义类型返回 

自定义类: 
  
Java代码  复制代码
  1. package com.domain;      
  2.      
  3. public class MyUser {      
  4.      
  5.     private String username;      
  6.     private String password;      
  7. //因为:String hql = " select new  com.domain.MyUser(name,passwd) from Users";所以必须要有接受2个参数的构造函数      
  8.     public MyUser(String username,String password){      
  9.         this.username = username;      
  10.         this.password = password;      
  11.     }      
  12.           
  13.     public String getUsername() {      
  14.         return username;      
  15.     }      
  16.     public void setUsername(String username) {      
  17.         this.username = username;      
  18.     }      
  19.     public String getPassword() {      
  20.         return password;      
  21.     }      
  22.     public void setPassword(String password) {      
  23.         this.password = password;      
  24.     }      
  25.           
  26.           
  27. }    
Java代码   收藏代码
  1. package com.domain;     
  2.     
  3. public class MyUser {     
  4.     
  5.     private String username;     
  6.     private String password;     
  7. //因为:String hql = " select new  com.domain.MyUser(name,passwd) from Users";所以必须要有接受2个参数的构造函数     
  8.     public MyUser(String username,String password){     
  9.         this.username = username;     
  10.         this.password = password;     
  11.     }     
  12.          
  13.     public String getUsername() {     
  14.         return username;     
  15.     }     
  16.     public void setUsername(String username) {     
  17.         this.username = username;     
  18.     }     
  19.     public String getPassword() {     
  20.         return password;     
  21.     }     
  22.     public void setPassword(String password) {     
  23.         this.password = password;     
  24.     }     
  25.          
  26.          
  27. }    


  
Java代码  复制代码
  1. //通过query.list()出来的list里存放的不再是默认的Object数组了,而是自定义的类MyUser,必须加包名,String hql = "from Users";中的Users类也是必须加包名的,但是因为再Users.hbm.xml里<hibernate-mapping auto-import="true"> auto-import默认值为true(所以auto-import属性也可以不写),自动导入了      
  2.         String hql = " select new  com.domain.MyUser(name,passwd) from Users";      
  3.         Query query = session.createQuery(hql);      
  4.         //默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是MyUser对象了      
  5.         List<MyUser> myUsers = query.list();      
  6.         for(MyUser myUser : myUsers){      
  7.             String name = myUser.getUsername();      
  8.             String passwd = myUser.getPassword();      
  9.             System.out.println(name + " : " + passwd);      
  10.         }      
  11.         /**    
  12.         输出结果为:    
  13.         name1 : password1    
  14.         name2 : password2    
  15.         name3 : password3    
  16.          */    
Java代码   收藏代码
  1. //通过query.list()出来的list里存放的不再是默认的Object数组了,而是自定义的类MyUser,必须加包名,String hql = "from Users";中的Users类也是必须加包名的,但是因为再Users.hbm.xml里<hibernate-mapping auto-import="true"> auto-import默认值为true(所以auto-import属性也可以不写),自动导入了     
  2.         String hql = " select new  com.domain.MyUser(name,passwd) from Users";     
  3.         Query query = session.createQuery(hql);     
  4.         //默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是MyUser对象了     
  5.         List<MyUser> myUsers = query.list();     
  6.         for(MyUser myUser : myUsers){     
  7.             String name = myUser.getUsername();     
  8.             String passwd = myUser.getPassword();     
  9.             System.out.println(name + " : " + passwd);     
  10.         }     
  11.         /**   
  12.         输出结果为:   
  13.         name1 : password1   
  14.         name2 : password2   
  15.         name3 : password3   
  16.          */    


8:条件查询 
Java代码  复制代码
  1. //条件查询,参数索引值从0开始,索引位置。通过setString,setParameter设置参数      
  2.         String hql = "from Users where name=? and passwd=?";      
  3.         Query query = session.createQuery(hql);      
  4.         //第1种方式      
  5. //      query.setString(0, "name1");      
  6. //      query.setString(1, "password1");      
  7.         //第2种方式      
  8.         query.setParameter(0"name1",Hibernate.STRING);      
  9.         query.setParameter(1"password1",Hibernate.STRING);      
  10.         List<Users> list = query.list();      
  11.         for(Users users : list){      
  12.             System.out.println(users.getId());      
  13.         }     
Java代码   收藏代码
  1. //条件查询,参数索引值从0开始,索引位置。通过setString,setParameter设置参数     
  2.         String hql = "from Users where name=? and passwd=?";     
  3.         Query query = session.createQuery(hql);     
  4.         //第1种方式     
  5. //      query.setString(0, "name1");     
  6. //      query.setString(1, "password1");     
  7.         //第2种方式     
  8.         query.setParameter(0"name1",Hibernate.STRING);     
  9.         query.setParameter(1"password1",Hibernate.STRING);     
  10.         List<Users> list = query.list();     
  11.         for(Users users : list){     
  12.             System.out.println(users.getId());     
  13.         }     
          
Java代码  复制代码
  1. //条件查询,自定义索引名(参数名):username,:password.通过setString,setParameter设置参数      
  2.         String hql = "from Users where name=:username and passwd=:password";      
  3.         Query query = session.createQuery(hql);      
  4.         //第1种方式      
  5. //      query.setString("username", "name1");      
  6. //      query.setString("password", "password1");      
  7.         //第2种方式,第3个参数确定类型      
  8.         query.setParameter("username""name1",Hibernate.STRING);      
  9.         query.setParameter("password""password1",Hibernate.STRING);      
  10.         List<Users> list = query.list();      
  11.         for(Users users : list){      
  12.             System.out.println(users.getId());      
  13.         }    
Java代码   收藏代码
  1. //条件查询,自定义索引名(参数名):username,:password.通过setString,setParameter设置参数     
  2.         String hql = "from Users where name=:username and passwd=:password";     
  3.         Query query = session.createQuery(hql);     
  4.         //第1种方式     
  5. //      query.setString("username", "name1");     
  6. //      query.setString("password", "password1");     
  7.         //第2种方式,第3个参数确定类型     
  8.         query.setParameter("username""name1",Hibernate.STRING);     
  9.         query.setParameter("password""password1",Hibernate.STRING);     
  10.         List<Users> list = query.list();     
  11.         for(Users users : list){     
  12.             System.out.println(users.getId());     
  13.         }    


Java代码  复制代码
  1. //条件查询,通过setProperties设置参数      
  2.         String hql = "from Users where name=:username and passwd=:password";      
  3.         Query query = session.createQuery(hql);      
  4.         //MyUser类的2个属性必须和:username和:password对应      
  5.         MyUser myUser = new MyUser("name1","password1");      
  6.         query.setProperties(myUser);      
  7.         List<Users> list = query.list();      
  8.         for(Users users : list){      
  9.             System.out.println(users.getId());      
  10.         }    
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController': Unsatisfied dependency expressed through field 'userRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository' defined in com.kucun.dataDo.UserRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract com.kucun.data.entity.User com.kucun.dataDo.UserRepository.GetUsers(java.lang.String,java.lang.String)! at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:660) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1425) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:897) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879) ~[spring-context-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551) ~[spring-context-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:755) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:402) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:173) [spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:153) [spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:95) [spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:172) [spring-web-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5128) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.37] at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717) [catalina.jar:9.0.37] at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690) [catalina.jar:9.0.37] at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705) [catalina.jar:9.0.37] at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1133) [catalina.jar:9.0.37] at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1866) [catalina.jar:9.0.37] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_331] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_331] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-util.jar:9.0.37] at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112) [na:1.8.0_331] at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1045) [catalina.jar:9.0.37] at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:429) [catalina.jar:9.0.37] at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1576) [catalina.jar:9.0.37] at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366) [catalina.jar:9.0.37] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:936) [catalina.jar:9.0.37] at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.37] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) [catalina.jar:9.0.37] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) [catalina.jar:9.0.37] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_331] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-util.jar:9.0.37] at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) [na:1.8.0_331] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) [catalina.jar:9.0.37] at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.37] at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.37] at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.37] at org.apache.catalina.startup.Catalina.start(Catalina.java:738) [catalina.jar:9.0.37] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_331] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_331] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_331] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_331] at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:342) [bootstrap.jar:9.0.37] at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473) [bootstrap.jar:9.0.37] Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository' defined in com.kucun.dataDo.UserRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract com.kucun.data.entity.User com.kucun.dataDo.UserRepository.GetUsers(java.lang.String,java.lang.String)! at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1799) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1307) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1227) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:657) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] ... 62 common frames omitted Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract com.kucun.data.entity.User com.kucun.dataDo.UserRepository.GetUsers(java.lang.String,java.lang.String)! at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:93) ~[spring-data-jpa-2.3.9.RELEASE.jar:2.3.9.RELEASE] at org.springframework.data.jpa.repository.query.SimpleJpaQuery.<init>(SimpleJpaQuery.java:63) ~[spring-data-jpa-2.3.9.RELEASE.jar:2.3.9.RELEASE] at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromMethodWithQueryString(JpaQueryFactory.java:76) ~[spring-data-jpa-2.3.9.RELEASE.jar:2.3.9.RELEASE] at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromQueryAnnotation(JpaQueryFactory.java:56) ~[spring-data-jpa-2.3.9.RELEASE.jar:2.3.9.RELEASE] at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:146) ~[spring-data-jpa-2.3.9.RELEASE.jar:2.3.9.RELEASE] at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:216) ~[spring-data-jpa-2.3.9.RELEASE.jar:2.3.9.RELEASE] at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:81) ~[spring-data-jpa-2.3.9.RELEASE.jar:2.3.9.RELEASE] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lookupQuery(QueryExecutorMethodInterceptor.java:99) ~[spring-data-commons-2.3.9.RELEASE.jar:2.3.9.RELEASE] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lambda$mapMethodsToQuery$1(QueryExecutorMethodInterceptor.java:92) ~[spring-data-commons-2.3.9.RELEASE.jar:2.3.9.RELEASE] at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_331] at java.util.Iterator.forEachRemaining(Iterator.java:116) ~[na:1.8.0_331] at java.util.Collections$UnmodifiableCollection$1.forEachRemaining(Collections.java:1051) ~[na:1.8.0_331] at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) ~[na:1.8.0_331] at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482) ~[na:1.8.0_331] at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) ~[na:1.8.0_331] at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[na:1.8.0_331] at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_331] at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) ~[na:1.8.0_331] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.mapMethodsToQuery(QueryExecutorMethodInterceptor.java:94) ~[spring-data-commons-2.3.9.RELEASE.jar:2.3.9.RELEASE] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lambda$new$0(QueryExecutorMethodInterceptor.java:84) ~[spring-data-commons-2.3.9.RELEASE.jar:2.3.9.RELEASE] at java.util.Optional.map(Optional.java:215) ~[na:1.8.0_331] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.<init>(QueryExecutorMethodInterceptor.java:84) ~[spring-data-commons-2.3.9.RELEASE.jar:2.3.9.RELEASE] at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:332) ~[spring-data-commons-2.3.9.RELEASE.jar:2.3.9.RELEASE] at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$4(RepositoryFactoryBeanSupport.java:294) ~[spring-data-commons-2.3.9.RELEASE.jar:2.3.9.RELEASE] at org.springframework.data.util.Lazy.getNullable(Lazy.java:211) ~[spring-data-commons-2.3.9.RELEASE.jar:2.3.9.RELEASE] at org.springframework.data.util.Lazy.get(Lazy.java:95) ~[spring-data-commons-2.3.9.RELEASE.jar:2.3.9.RELEASE] at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:300) ~[spring-data-commons-2.3.9.RELEASE.jar:2.3.9.RELEASE] at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:144) ~[spring-data-jpa-2.3.9.RELEASE.jar:2.3.9.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1858) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1795) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] ... 72 common frames omitted Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: * near line 1, column 8 [select * from user where andy=:andy ,pass=:pass] at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:138) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:734) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_331] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_331] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_331] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_331] at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:366) ~[spring-orm-5.2.15.RELEASE.jar:5.2.15.RELEASE] at com.sun.proxy.$Proxy84.createQuery(Unknown Source) ~[na:na] at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:87) ~[spring-data-jpa-2.3.9.RELEASE.jar:2.3.9.RELEASE] ... 101 common frames omitted Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: * near line 1, column 8 [select * from user where andy=:andy ,pass=:pass] at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:301) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:189) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:113) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:73) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:162) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:613) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:725) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] ... 109 common frames omitted
最新发布
05-25
### 回答问题 #### 1. 问题分析 从日志信息来看,Spring 抛出了 `UnsatisfiedDependencyException` 异常,提示在创建 `userController` Bean 时,无法满足对 `userRepository` 的依赖注入。具体原因是 `userRepository` 中的某个自定义查询方法存在语法错误。 异常的核心信息如下: - `Validation failed for query for method public abstract com.kucun.data.entity.User com.kucun.dataDo.UserRepository.GetUsers(java.lang.String,java.lang.String)!` - `org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: * near line 1, column 8 [select * from user where andy=:andy ,pass=:pass]` 这表明 JPA 查询语句中存在语法错误,特别是 `select *` 不符合 JPQL 的规范。 --- #### 2. 解决方法 ##### 方法一:修正 JPQL 查询语句 JPQL(Java Persistence Query Language)不支持 `select *` 语法,必须明确指定实体类名或字段名。以下是修正后的代码: ```java import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; public interface UserRepository extends CrudRepository<User, Long> { @Query("SELECT u FROM User u WHERE u.username = :username AND u.password = :password") User GetUsers(@javax.persistence.Parameter("username") String username, @javax.persistence.Parameter("password") String password); } ``` ##### 方法二:使用原生 SQL 查询 如果需要使用 `select *`,可以通过设置 `nativeQuery = true` 来执行原生 SQL 查询。 ```java import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; public interface UserRepository extends CrudRepository<User, Long> { @Query(value = "SELECT * FROM users WHERE username = :username AND password = :password", nativeQuery = true) User GetUsers(@javax.persistence.Parameter("username") String username, @javax.persistence.Parameter("password") String password); } ``` ##### 方法三:检查实体类映射 确保 `User` 实体类中包含 `username` 和 `password` 字段,并且这些字段与数据库表中的列名一致。 ```java import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; // Getter 和 Setter 方法 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } ``` --- ### 解释 1. **JPQL 查询语法规则**: - JPQL 是一种面向对象的查询语言,类似于 SQL,但操作的是实体类而不是数据库表。 - JPQL 不支持 `select *` 语法,必须明确指定实体类名或字段名。例如,`SELECT u FROM User u` 表示查询所有 `User` 实体。 2. **异常原因**: - 原始查询语句中使用了 `select *`,这在 JPQL 中是非法的。 - 查询条件中缺少字段名(如 `andy` 和 `pass`),导致 Hibernate 无法解析查询语句。 3. **解决方法的核心思想**: - 确保所有 JPQL 查询都遵循 JPQL 的语法规则。 - 如果需要使用原生 SQL 查询,必须通过 `nativeQuery = true` 显式声明。 4. **实体类映射的重要性**: - 确保实体类中的字段名与数据库表中的列名一致。 - 使用 `@Column` 注解可以显式指定字段与列的映射关系。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值