lgb934 2013-07-31 08:27 采纳率: 0%
浏览 980

关于hibernate查询的和开发中的一些疑问

我在开发的过程中遇到一些疑问,希望各大牛帮我解答下。

环境介绍:

假设现在有2个表

表名:category(文章分类)

字段:
id 主键
name 文章分类中文名
desc 描述

表名:article(文章列表)

字段:
id 主键
categoryid 分类id
title 文章标题
content 内容

因为用的是hibernate, 上面两个表对应的PO分别是CategoryPO , ArticlePO.没有配置外键映射.

  1. 现在要求根据文章分类查询个分类的前10条record。

我想到的办法(1) .在service 层查询出所有categoryPO.name,然后再根据categoryPO.name去Article 里查询每个categoryPO.name的各10条。这样我有多少个category.name就返回多少个list,然后遍历每个list就行了。但是这样会造成多条sql语句查询,事务是用spring 配置的在service层的自动事务管理,

(2).只用一条HQL 查出一个list结果类似下面

id category.name aritcle.title
1 分类1 标题1
2 分类1 标题2
..... 这里重复。每个分类有10条
11 分类2 标题11
12 分类2 标题12

但是这句HQL不会写。然后前台在遍历这个list 。每次将遍历的category.name用临时变量保存,当遇到category.name不同是当作下一个category直接重复生成1个DIV显示新的category.

(3)在(2)的基础上不left join categoryPO,

id article.categoryid aritcle.title
1 1 标题1
2 1 标题2
..... 这里重复。每个分类有10条
11 2 标题11
12 2 标题12

然后再在java里用for循环把categoryPO set到articlePO里,不知道java的效率高还是数据库的效率高。

注:categoryPO我是全部已经缓存在ehcache里的,并且设置为永远不过期。

  1. 就是有一种情况,我只需要PO的某些字段例如上面的AritclePO 有很多属性,但是某些时候我可能只需要部分例如:title,id...等。我人比较懒不想写select a.title,a.id from AritlcePO a,等语句,因为有时候虽然不是全部字段,但是字段也挺多;我能不能只写from AritclePO ,然后查询的时候,只根据我要的字段生成SQL,而不是默认的查询全部字段。我感觉这个有点类似延迟加载。能实现吗?

  2. 我如果把对象放在缓存里(这里的缓存是指ehcache),并且设置永远不过期,这和直接在类里加载到内存有什么区别,比如:我用的是tomcat,那如果我把对象直接放到application里又有什么区别。

期望大牛们为我解答,也欢迎大家讨论一下,如果有表达不清晰的地方可以尽管问。谢谢...

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-01-09 17:04
    关注

    对于第一种方法,由于每个分类的数据都是分别查询的,所以会发出多条SQL查询,对数据库的压力会比较大,并且会带来较长的响应时间。


    对于第二种方法,使用HQL进行左连接查询即可实现查询文章分类和文章列表的同时,按文章分类分组的目的。你可以使用如下的HQL语句:

    SELECT a.id, c.name, a.title
    FROM Article a LEFT JOIN a.category c
    GROUP BY c.name
    

    这条HQL的意思是查询文章列表中所有文章的ID、文章分类的名称、文章的标题,并按文章分类的名称分组。你可以将这条HQL传给Hibernate的createQuery方法,然后调用query的list方法获取查询结果。


    对于第三种方法,使用Java代码遍历查询结果并添加文章分类的做法也是可行的,但是如果文章分类很多的话,这样做的效率会比较低。可以考虑使用Java8的Stream API或Guava的Iterables工具类来简化代码,但是由于数据库查询的效率比较高,所以第二种方法的总体效率可能会更高。


    最后,你可以使用Hibernate的二级缓存功能来缓存文章分类的PO,以减少数据库访问的次数,提升总体的查询效率。

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!