如何编写 hql 子查询以防万一呢?

Posted

技术标签:

【中文标题】如何编写 hql 子查询以防万一呢?【英文标题】:How to write hql subquery in case when then? 【发布时间】:2014-08-20 05:38:00 【问题描述】:
SELECT rd.rdKey AS rdKey,
(
    CASE
      WHEN 
          replace (translate(rd.rdOpr1Value,'0123456789','0000000000'),'0','') is null
      THEN  
          COALESCE
          (
             SELECT c.isForeighn FROM ColumnMap c WHERE                              c.columnmapkey=rd.rdOpr1Value,'N'
          )
      ELSE 'N'
   END
) AS foreignYN,
rd.rdSetNO AS rdSetNO,
rd.createdUser AS createdUser,
rd.createdDateTime AS createdDateTime,
rd.updatedUser AS updatedUser,
rd.updatedDateTime AS updatedDateTime
FROM RuleDetail rd 
where rd.rdKey = 1;

对于上述查询,我​​遇到了错误

java.lang.NullPointerException 在 org.hibernate.hql.antlr.HqlBaseParser.identPrimary(HqlBaseParser.java:4341) 在 org.hibernate.hql.antlr.HqlBaseParser.primaryExpression(HqlBaseParser.java:948) 在 org.hibernate.hql.antlr.HqlBaseParser.atom(HqlBaseParser.java:3750) 在 org.hibernate.hql.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3513) 在 org.hibernate.hql.antlr.HqlBaseParser.whenClause(HqlBaseParser.java:3887) 在 org.hibernate.hql.antlr.HqlBaseParser.caseExpression(HqlBaseParser.java:3553) 在 org.hibernate.hql.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3475) 在 org.hibernate.hql.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:3380) 在 org.hibernate.hql.antlr.HqlBaseParser.additiveExpression(HqlBaseParser.java:3073) 在 org.hibernate.hql.antlr.HqlBaseParser.concatenation(HqlBaseParser.java:632) 在 org.hibernate.hql.antlr.HqlBaseParser.relationalExpression(HqlBaseParser.java:2836) 在 org.hibernate.hql.antlr.HqlBaseParser.equalityExpression(HqlBaseParser.java:2692) 在 org.hibernate.hql.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2651) 在 org.hibernate.hql.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:2562) 在 org.hibernate.hql.antlr.HqlBaseParser.logicalOrExpression(HqlBaseParser.java:2522) 在 org.hibernate.hql.antlr.HqlBaseParser.expression(HqlBaseParser.java:2283) 在 org.hibernate.hql.antlr.HqlBaseParser.expressionOrVector(HqlBaseParser.java:4583) 在 org.hibernate.hql.antlr.HqlBaseParser.primaryExpression(HqlBaseParser.java:1035) 在 org.hibernate.hql.antlr.HqlBaseParser.atom(HqlBaseParser.java:3750) 在 org.hibernate.hql.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3513) 在 org.hibernate.hql.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:3380) 在 org.hibernate.hql.antlr.HqlBaseParser.additiveExpression(HqlBaseParser.java:3073) 在 org.hibernate.hql.antlr.HqlBaseParser.concatenation(HqlBaseParser.java:632) 在 org.hibernate.hql.antlr.HqlBaseParser.relationalExpression(HqlBaseParser.java:2836) 在 org.hibernate.hql.antlr.HqlBaseParser.equalityExpression(HqlBaseParser.java:2692) 在 org.hibernate.hql.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2651) 在 org.hibernate.hql.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:2562) 在 org.hibernate.hql.antlr.HqlBaseParser.logicalOrExpression(HqlBaseParser.java:2522) 在 org.hibernate.hql.antlr.HqlBaseParser.expression(HqlBaseParser.java:2283) 在 org.hibernate.hql.antlr.HqlBaseParser.aliasedExpression(HqlBaseParser.java:2470) 在 org.hibernate.hql.antlr.HqlBaseParser.selectedPropertiesList(HqlBaseParser.java:1593) 在 org.hibernate.hql.antlr.HqlBaseParser.selectClause(HqlBaseParser.java:1486) 在 org.hibernate.hql.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1208) 在 org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:774) 在 org.hibernate.hql.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:313) 在 org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:161) 在 org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:274) 在 org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:182) 在 org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) 在 org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:101) 在 org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:80) 在 org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98) 在 org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156) 在 org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135) 在 org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1760) 在 fts.hrms.HRSetUp.UserAdmin.dao.RuleDetailDAO.getObjectByKey(RuleDetailDAO.java:158) 在 fts.hrms.HRSetUp.UserAdmin.service.RuleDetailService.getRuleDetailByKey(RuleDetailService.java:73) 在 fts.hrms.HRSetUp.UserAdmin.service.RuleDetailService$$FastClassByCGLIB$$ffaad115.invoke() 在 net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191) 在 org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:688) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:108) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 在 org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621) 在 fts.hrms.HRSetUp.UserAdmin.service.RuleDetailService$$EnhancerByCGLIB$$118607e8_2.getRuleDetailByKey() 在 fts.hrms.HRSetUp.UserAdmin.controller.RuleDetailController.getRuleDetailByKey(RuleDetailController.java:72) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)在 java.lang.reflect.Method.invoke(未知来源)在 org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436) 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669) 在 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:322) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:125) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:184) 在 org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:155) 在 org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 在 org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 java.lang.Thread.run(未知来源) java.lang.NullPointerException 在 fts.hrms.HRSetUp.UserAdmin.dao.RuleDetailDAO.getObjectByKey(RuleDetailDAO.java:165) 在 fts.hrms.HRSetUp.UserAdmin.service.RuleDetailService.getRuleDetailByKey(RuleDetailService.java:73) 在 fts.hrms.HRSetUp.UserAdmin.service.RuleDetailService$$FastClassByCGLIB$$ffaad115.invoke() 在 net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191) 在 org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:688) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:108) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 在 org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621) 在 fts.hrms.HRSetUp.UserAdmin.service.RuleDetailService$$EnhancerByCGLIB$$118607e8_2.getRuleDetailByKey() 在 fts.hrms.HRSetUp.UserAdmin.controller.RuleDetailController.getRuleDetailByKey(RuleDetailController.java:72) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)在 java.lang.reflect.Method.invoke(未知来源)在 org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436) 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669) 在 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:322) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:125) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:184) 在 org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:155) 在 org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 在 org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 java.lang.Thread.run(Unknown Source)

【问题讨论】:

类似帖子,可以参考-***.com/q/23774916/366964 【参考方案1】:

Hibernate 不支持此功能。 但确实存在一种解决方法。 在数据库中创建视图,然后使用HQL通过java获取结果。

创建或替换强制视图 VW_ENTITY_VALUE(entityValue) 作为 当 a.entityId 为空时选择案例,然后为“无效”,否则 (从 tblName b 中选择 b.entityName,其中 b.entityId =a.entityId) 从 tblEntity a 结束;

来自 HQL 的文档: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-subqueries

14.13。子查询

对于支持子选择的数据库,Hibernate 支持查询中的子查询。子查询必须用括号括起来(通常由 SQL 聚合函数调用)。甚至相关的子查询(在外部查询中引用别名的子查询)也是允许的。

来自 Cat as fatcat 其中 fatcat.weight > ( 从 DomesticCat 猫中选择 avg(cat.weight) ) 来自家猫作为猫 其中 cat.name = some ( 从名称中选择 name.nickName 作为名称 ) 来自猫为猫 不存在的地方( 来自 Cat as mate where mate.mate = cat ) 来自家猫作为猫 cat.name 不在 ( 从名称中选择 name.nickName 作为名称 ) 选择 cat.id,(从 cat.kitten 套件中选择 max(kit.weight)) 来自猫为猫 请注意,HQL 子查询只能出现在 select 或 where 子句中。

【讨论】:

以上是关于如何编写 hql 子查询以防万一呢?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 cast 编写 hql 查询?

如何使用“构造函数”在“选择子句”中为多个表的选定列编写HQL JOIN查询

在 ( ... ) 查询中编写 HQL 的正确方法

如何在 Hadoop 中编写 HQL 表达式以验证特定格式的字母数字字段的格式,例如 X9999

如何将MySql子查询转换为HQL子查询

如何编写 hql/sql 来解决以下问题