【问题标题】:Hiberante Native Query, column not found休眠本机查询,未找到列
【发布时间】:2021-05-12 03:14:29
【问题描述】:

我正在尝试打印 SQL 查询结果,但显示未找到列,

public class SearchDriver {

    @Autowired
    EntityManager entityManager;

    public void  search(String key, String value){
List<Driver> resultDerivers = entityManager.createNativeQuery("select * from driver where "+key+"="+value).getResultList();

       System.out.println(resultDerivers);

//end of method 

}

错误

Hibernate: select * from driver where age=45

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not prepare statement   
2021-02-08 18:59:19.967  WARN 11936 --- [nio-8080-exec-8] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 42122, SQLState: 42S22
2021-02-08 18:59:19.967 ERROR 11936 --- [nio-8080-exec-8] o.h.engine.jdbc.spi.SqlExceptionHelper   : Column "45" not found; SQL statement:
select * from driver where username=driver05 [42122-197]
2021-02-08 18:59:19.983 ERROR 11936 --- [nio-8080-exec-8] com.util.LoggingInterceptor      : method: GET        uri: /v1/drivers/searchBy/username/driver05      status: 200     remoteAddress: 0:0:0:0:0:0:0:1

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not prepare statement
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:149) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
        at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1423) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
        at org.hibernate.query.Query.getResultList(Query.java:146) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
       
        at com.freenow.service.driver.DefaultDriverService.searchByCriteria(DefaultDriverService.java:126) ~[classes/:na]
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-5.0.10.RELEASE.jar:5.0.10.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:684) ~[spring-aop-5.0.10.RELEASE.jar:5.0.10.RELEASE]

【问题讨论】:

  • 从用户名=driver05 的驱动程序中选择 *。我想应该是 select * from driver where username='driver05'

标签: sql spring hibernate spring-data-jpa


【解决方案1】:

sql 查询中的字符串值必须用引号括起来,因此在您的情况下,您的代码应检查该值是否为字符串,在这种情况下,在将值添加到查询之前和之后添加 '。或者为了更简洁,使用不同的方法,一种用于数值,一种用于字符串,并根据您要用作过滤器的数据调用一种或其他方法:

    public void  search(String key, Int value){
    List<Driver> resultDerivers = entityManager.createNativeQuery("select * from driver where "+key+"="+value).getResultList();
}

    public void  search(String key, String value){
    List<Driver> resultDerivers = entityManager.createNativeQuery("select * from driver where "+key+"='"+value+"'").getResultList();
}

【讨论】:

  • 这个方案会导致sql注入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 2012-03-29
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
相关资源
最近更新 更多