最近遇到一个烦人的问题,费了不少时间才解决出来,把它贴出来分享!
问题如下:
产品对象TProduct和标签对象TTag,是通过中间表连接的双向多对多关联关系,要求是列出所有的标签,按标签的使用次数倒排序(即哪个标签关联的产品数最多,哪个标签放在第一个).
省略掉pojo的代码,其映射文件如下:
----------------------TProduct.hbm.xml-----------------------
xml 代码
- <id name="id" type="integer" column="id">
- <generator class="native"/>
- id>
- <property name="name" column="name" type="string" not-null="false" length="50"/>
- <set name="tags" table="TableLink_Product_Tags" order-by="tagId">
- <key column="productId"/>
- <many-to-many column="tagId" class="TTag"/>
- set>
------------------------TTag.hbm.xml-------------------------
xml 代码
- <id name="id" type="integer" column="id">
- <generator class="native" />
- id>
- <property name="name" column="name" type="string" />
- <set name="products" table="TableLink_Product_Tags">
- <key column="tagId" />
- <many-to-many class="TProduct" column="productId" />
- set>
条件很简单,就这么多,要求列出所有的标签,按照其关联的产品的数量倒排序(即标签使用次数倒排序),难就难在其排序上,
java 代码
- select t from TTag as t order by t.products.size desc
这样的写法肯定是不行的,生成的sql语句是错误的!
正确的写法如下:
java 代码
- select a from TProduct as t inner join t.tags as a group by a.id,a.name order by count(t.id) desc
这种写法才是正确的.
这个问题看起来简单,写起来麻烦,如果用sql写,我觉得还是比较好写的,而用hql来写,感觉有点抽象,大家还有别的实现方法么?
此外,还发现了一个sql语句的小特点,这个不能算问题,只是比较容易产生错误!
看这个sql语句:
select * from Table_Tag where id in(8,7,6,3,9)
这样得出的结果其顺序又会如何呢?
其实这么写的结果的显示顺序并非:8,7,6,3,9
应该是:3,6,7,8,9
所以为了追求结果排序,where id in()这个想法是不可取的
分享到:
相关推荐
### Hibernate中HQL语句查询学习笔记 #### HQL基础 **HQL**(Hibernate Query Language)是Hibernate框架推荐使用的查询语言,它提供了一种面向对象的方式来查询数据库,支持多种复杂的查询操作,如继承、多态及...
### Spring框架中HQL语句的使用方法 在学习Spring框架与Hibernate集成的过程中,掌握HQL(Hibernate Query Language)的使用方法是十分重要的。本文档将详细介绍如何在Spring环境中运用HQL进行数据查询操作,包括...
通过理解并熟练运用这些HQL语句,开发者可以更加高效地操作数据库,提升应用程序的性能和可维护性。在实际项目中,合理运用HQL能大大简化数据查询和处理的工作,使得代码更加面向对象,易于理解和维护。
标题:“Hibernate 经常用的一些HQL语句” 描述:“可以让我们更方便的学习Hibernate” ### HQL(Hibernate Query Language)在Hibernate中的应用 HQL是Hibernate框架提供的查询语言,它允许开发者以面向对象的...
HQL 支持使用`where`子句对结果进行过滤,以满足特定的条件。例如: ```hql from Employee as employee where employee.Name like 'J%' ``` 这条语句返回名字以`J`开头的所有员工记录。 综上所述,HQL 提供了一种...
HQL语句主要包括查询、选择、从、where、group by、having、order by等部分,与SQL非常相似。例如,一个简单的HQL查询可能如下所示: ```sql FROM Employee e WHERE e.name = 'John' ``` 这条语句将返回所有...
在实际开发中,HQL关联查询的应用场景非常广泛,特别是在需要跨多个实体进行数据检索的情况下。例如,在电子商务系统中,我们需要获取用户信息及其相关的订单信息时,就可以利用HQL关联查询来简化这一过程。此外,当...
在数据查询方面,Hibernate提供了多种查询方式,其中HQL(Hibernate Query Language)是一种基于SQL的领域查询语言,它允许开发者以面向对象的方式编写查询语句,而无需直接处理复杂的SQL语句。本文将深入探讨...
如果查询结果只有一条,可以使用`query.uniqueResult()`获取。Criteria查询是另一种面向对象的查询方式,通过Criteria接口、Restrictions和MatchMode等工具来构建和执行查询,提供了更灵活的查询构建方式。 总之,...
如果只需要查询`User`实体中的`name`字段,可以使用以下HQL语句: ```java List<String> names = session.createQuery("select user.name from User as user").list(); for (String name : names) { System.out...
投影查询是指每条查询结果仅包含一个或多个列的数据。根据查询结果的不同,可以将其封装为不同的形式。 1. **每列结果仅包含一个列**:可以将结果作为Object对象进行引用。 2. **每条查询结果不止一个列**: - ...
例如,如果我们只想获取用户的名字和年龄,可以使用如下HQL语句: ```java List[]> list = session.createQuery("select user.name, user.age from TUser as user").list(); ``` 此外,我们还可以利用 HQL 动态...
HQL支持一对一、一对多、多对一和多对多的关联查询。通过JOIN关键字,可以实现内连接、外连接(左连接、右连接、全连接)。例如: ```sql SELECT p, c FROM Product p JOIN p.category c WHERE c.name = '...
HQL支持一对一、一对多、多对一、多对多等关联查询: 1. **一对一关联**: 查询与`User`对象关联的`Profile`对象: ```java query = session.createQuery("from User u join fetch u.profile"); ``` 2. **一对...
`as p`则定义了一个别名`p`,方便后续在查询语句中引用这个实体。 #### 二、SELECT 子句 `SELECT`子句用于指定查询结果集的列或字段。例如: ```hql SELECT p.name FROM Person as p ``` 此示例中,查询将返回...
- **解释**: 这条HQL语句用于检索`Student`类的所有对象。 ##### 1.1.3 检索类的某几个属性 - **语法**: ```hql SELECT s.sname, s.sage FROM Student s; ``` - **解释**: 此语句用于检索`Student`类中的`sname`...
这条HQL语句中,`s.department`表示的是Student实体与Department实体之间的关联。Hibernate会在底层自动进行连接查询操作,转换为如下SQL语句: ```sql SELECT student0_.sno as sno1_, student0_.sname as sname1...