项目中遇到的HQL查询问题

2024-05-23 07:08
文章标签 问题 项目 查询 遇到 hql

本文主要是介绍项目中遇到的HQL查询问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述:
目的:想要查询出所有最新版本的组件
说明:组件:版本 =1:n关系 ,如果这个组件只有一个版本也要能够查出来。

项目中使用的是内存数据库,无法看到表结构,这里的例子仅仅用于模拟。
也即是:

  1. 最初的数据是这样的。
    这里写图片描述
  2. 想要的结果是这样的。
    这里写图片描述

  3. 最初的设想是这样的。
select component from Component component where component.owner=:userId andcomponent.componentId.version.versionStringin (select Max(c.componentId.version.versionString) from Component c where component.owner=:userId  group by c.componentId.name )

不足:发现对于同一个组件,它的不同版本都能出现,这个bug我没发现,后来他们发现了。。

4. 经历的挫折

select c2.id,c2.name,c2.user,c2.categoryname, Max(c2.version) version from component c2 where  c2.user="tan"  group by c2.name;

这样在数据库中查询时是没有问题的,关键是在项目中一般是面向对象的,如果在项目中改为如下:

select c.componentId.name,Max(c.componnetId.version.versionString) from component c
where c.owner=:userId group by c.componentId.name

发现能正常显示,但是当在前面加入其它字段(比如:c.image)它就会报错了,如果想让它不报错就得以它来分组,但是在实际情况中绝不可能这么做,因为组件相同但是版本是不同的。

5. 最终的解决方案
上面的对象查询中只用一个组件名并不能唯一确定一个对应版本的组件,那么如何来唯一确定呢?
我想了很久也没有想到解决办法,后来在我的组长的帮助下,终于解决了这个问题。

既然一个字段不能唯一确定,为什么不用2个字段进行唯一确定呢?

CONCAT(s1,s2) 连接连个字符串 字符串函数 JPQHQL HQL CONCAT([对象属性],[对象属性])

使用CONCAT函数就能够使得组件名和版本后捆绑在一起,就能够唯一确定最新版本的组件。

最终解决,代码如下:

 select component from Component component where component.owner=:userId and CONCAT(component.componentId.name,component.componentId.version.versionString) in (select CONCAT(c.componentId.name,Max(c.componentId.version.versionString)) from Component c group by c.componentId.name )

上面的某些情况下会出现bug,比如ComponentName=AB,Version=CD,而另外一个ComponentName=A,Version=BCD,这样一来拼接的结果都是ABCD,这样就会出现重复的问题。

【如何解决?】—-可以使用括号括起来分别进行条件的判断

select component from Component component where component.isApproved=true and component.categoryName = :categoryName and (component.componentId.name,component.componentId.version.versionString) in (select c.componentId.name,Max(c.componentId.version.versionString) from Component c   group by c.componentId.name )

参考网址:http://www.cnblogs.com/caotang/archive/2011/01/18/1937932.html

6.反思

遇到问题,一定要敢于去想,敢于往不同的层面去想并不断的尝试去解决它,切记不能够固执己见,停在原地打转,柳暗花明往往就在于思想越界的一瞬间。

这篇关于项目中遇到的HQL查询问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/996168

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring