问题描写叙述:

目的:想要查询出全部最新版本号的组件

说明:组件:版本号 =1:n关系 ,假设这个组件仅仅有一个版本号也要可以查出来。

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

也即是:

  1. 最初的数据是这种。

  2. 想要的结果是这种。

  3. 最初的设想是这种。

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查询问题的更多相关文章

  1. J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())

    J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())   当我们使用Hibernate进行数据的CRUD操作时,利用模版进行操作不失为一种方法. ...

  2. 【hql】spring data jpa中 @Query使用hql查询 问题

    spring data jpa中 @Query使用hql查询 问题 使用hql查询, 1.from后面跟的是实体类 不是数据表名 2.字段应该用实体类中的字段 而不是数据表中的属性 实体如下 hql使 ...

  3. getHibernateTemplate()(Spring中常用的hql查询方法)

    Spring中常用的hql查询方法(getHibernateTemplate()) --------------------------------- 一.find(String queryStrin ...

  4. Spring中常用的hql查询方法(getHibernateTemplate())

    一.find(String queryString); 示例:getHibernateTemplate().find("from bean.User"); 返回所有User对象 二 ...

  5. hibernate中.常见的hql查询语句

    hql是非常有意识的被设计为完全面向对象的查询 基本规则: 1.hql语法类似于sql,但它后面跟的不是表名和字段名,而是类名和属性名 2.hql大小写不敏感.但是设计java类名,包名,属性名时大小 ...

  6. 【Hibernate步步为营】--hql查询小介

    HQL 是指Hibernate Query Language,它是Hibernate的查询语言,拥有一套自己的查询机制,它的查询语句和SQL非常类似.在使用的时候可以非常快上手.HQL提供了基本上SQ ...

  7. 坑暗花明:又遇 .NET Core 中 System.Data.SqlClient 查询缓慢的问题

    之前发布过一篇博文 下单快发货慢:一个 JOIN SQL 引起 SqlClient 读取数据慢的奇特问题,当时遇到的问题是从 SQL Server 2008 R2 中查询获取 100 条记录竟然耗时 ...

  8. oracle性能优化(项目中的一个sql优化的简单记录)

    在项目中,写的sql主要以查询为主,但是数据量一大,就会突出sql性能优化的重要性.其实在数据量2000W以内,可以考虑索引,但超过2000W了,就要考虑分库分表这些了.本文主要记录在实际项目中,一个 ...

  9. Hibernate 中Hql 查询中间表的用法

    案例简述: 项目中存在User 用户表 和 Role 角色表 它们之间是多对多的关系 在User类定义中 使用hibernate注解 //角色列表 @ManyToMany(targetEntity = ...

随机推荐

  1. mkdir与makedirs

    mkdir创建的是一级目录 makedirs可以创建多级目录 mkdir -p可以递归创建目录

  2. node的影响及前后端之争

    作者:知乎用户链接:https://www.zhihu.com/question/59578433/answer/326694511来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  3. LinkedList集合(JDK1.8)

    简述 按照上篇笔记ArrayList集合继续进行介绍list的另一个常见子类LinkedList ?LinkedList介绍 1.数据结构 说明:linkedlist的底层数据结构是个双向链表结构,也 ...

  4. phpStrom+xdebug调试php

    1>xdebug下载 1.1>xdebug官网可以根据phpinfo()源代码来提供对应版本的xdebug,地址:https://xdebug.org/wizard.php 如下截图 1. ...

  5. Shell函数和正则表达式

    1. shell函数 shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直接调用该段代码. 格式: func() {   #指定 ...

  6. 使用finalshll连接linux

    一.安装ubuntu: 我在window10上装了VMware,好像window10自带虚拟机吧;然后傻瓜式装机,装好后发现没网不知道什么原因,然后百度啪啦啪啦找了一堆,解决方法是: 然后重启下ubu ...

  7. 实现验证的vsftpd虚拟用户

    实现基于文件验证的vsftpd虚拟用户--(一台) 一.创建用户数据库文件 vim /etc/vsftpd/vuser cd /etc/vsftpd/ db_load -T -t hash -f vu ...

  8. js 异步编程方案

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise http://www. ...

  9. LeetCode(42)Trapping Rain Water

    题目 Given n non-negative integers representing an elevation map where the width of each bar is 1, com ...

  10. 【HDU 6008】Worried School(模拟)

    Problem Description You may already know that how the World Finals slots are distributed in EC sub-r ...