项目中遇到的HQL查询问题
问题描写叙述:
目的:想要查询出全部最新版本号的组件
说明:组件:版本号 =1:n关系 ,假设这个组件仅仅有一个版本号也要可以查出来。
项目中使用的是内存数据库,无法看到表结构,这里的样例仅仅用于模拟。
也即是:
- 最初的数据是这种。
- 想要的结果是这种。
- 最初的设想是这种。
select component from Component component where component.owner=:userId andcomponent.componentId.version.versionString
in (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查询问题的更多相关文章
- J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())
J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate()) 当我们使用Hibernate进行数据的CRUD操作时,利用模版进行操作不失为一种方法. ...
- 【hql】spring data jpa中 @Query使用hql查询 问题
spring data jpa中 @Query使用hql查询 问题 使用hql查询, 1.from后面跟的是实体类 不是数据表名 2.字段应该用实体类中的字段 而不是数据表中的属性 实体如下 hql使 ...
- getHibernateTemplate()(Spring中常用的hql查询方法)
Spring中常用的hql查询方法(getHibernateTemplate()) --------------------------------- 一.find(String queryStrin ...
- Spring中常用的hql查询方法(getHibernateTemplate())
一.find(String queryString); 示例:getHibernateTemplate().find("from bean.User"); 返回所有User对象 二 ...
- hibernate中.常见的hql查询语句
hql是非常有意识的被设计为完全面向对象的查询 基本规则: 1.hql语法类似于sql,但它后面跟的不是表名和字段名,而是类名和属性名 2.hql大小写不敏感.但是设计java类名,包名,属性名时大小 ...
- 【Hibernate步步为营】--hql查询小介
HQL 是指Hibernate Query Language,它是Hibernate的查询语言,拥有一套自己的查询机制,它的查询语句和SQL非常类似.在使用的时候可以非常快上手.HQL提供了基本上SQ ...
- 坑暗花明:又遇 .NET Core 中 System.Data.SqlClient 查询缓慢的问题
之前发布过一篇博文 下单快发货慢:一个 JOIN SQL 引起 SqlClient 读取数据慢的奇特问题,当时遇到的问题是从 SQL Server 2008 R2 中查询获取 100 条记录竟然耗时 ...
- oracle性能优化(项目中的一个sql优化的简单记录)
在项目中,写的sql主要以查询为主,但是数据量一大,就会突出sql性能优化的重要性.其实在数据量2000W以内,可以考虑索引,但超过2000W了,就要考虑分库分表这些了.本文主要记录在实际项目中,一个 ...
- Hibernate 中Hql 查询中间表的用法
案例简述: 项目中存在User 用户表 和 Role 角色表 它们之间是多对多的关系 在User类定义中 使用hibernate注解 //角色列表 @ManyToMany(targetEntity = ...
随机推荐
- autoOpenBrowser: true, 运行npm后自动打开浏览器
autoOpenBrowser: true, 运行npm后自动打开浏览器
- 原生查找DOM的方法
JS获取DOM元素的方法(8种) 通过ID获取(getElementById) 通过name属性(getElementsByName) 通过标签名(getElementsByTagName) 通过类名 ...
- webpack 之 loader
loader简介 loader在webpack.config.js中进行配置,配置之后,会自动检测打包过程中引入的文件(import或require),通过test成功匹配被引入的文件名后,会对文件内 ...
- 剑指Offer(书):替换空格
题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 分析:通常来说,这样的题有两种方式 ...
- LeetCode(16)3Sum Closest
题目 Given an array S of n integers, find three integers in S such that the sum is closest to a given ...
- 跟初学者学习IbatisNet第二篇
在上一篇里面我们知道了什么是IbatisNet,并且知道了如何用IbatisNet进行简单的增删改查的操作,在这一篇文章里面我们主要介绍一下IbatisNet操作存储过程. 我们一般把存储过程分为两种 ...
- 遇到的Ajax相关问题
- 一个jboss启动shell脚本
脚本1: #!/bin/sh # paulo@evencom.com.br #JBOSS_HOME JBOSS_HOME="/opt/app/jboss-eap-6.3" JAVA ...
- BZOJ4373 算术天才与等差数列 题解
题目大意: 一个长度为n的序列,其中第i个数为a[i].修改一个点的值询问区间[l,r]内的数从小到大排序后能否形成公差为k的等差数列. 思路: 1.一段区间符合要求满足:(1)区间中的max-min ...
- [HDU4417]Super Mario(主席树+离散化)
传送门 又是一道主席树模板题,注意数组从0开始,还有主席树耗费空间很大,数组开大点,之前开小了莫名其妙TLE.QAQ ——代码 #include <cstdio> #include < ...