我在开发的过程中遇到一些疑问,希望各大牛帮我解答下。
环境介绍:
假设现在有2个表
表名:category(文章分类)
字段:
id 主键
name 文章分类中文名
desc 描述
表名:article(文章列表)
字段:
id 主键
categoryid 分类id
title 文章标题
content 内容
因为用的是hibernate, 上面两个表对应的PO分别是CategoryPO , ArticlePO.没有配置外键映射.
- 现在要求根据文章分类查询个分类的前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里的,并且设置为永远不过期。
就是有一种情况,我只需要PO的某些字段例如上面的AritclePO 有很多属性,但是某些时候我可能只需要部分例如:title,id...等。我人比较懒不想写select a.title,a.id from AritlcePO a,等语句,因为有时候虽然不是全部字段,但是字段也挺多;我能不能只写from AritclePO ,然后查询的时候,只根据我要的字段生成SQL,而不是默认的查询全部字段。我感觉这个有点类似延迟加载。能实现吗?
我如果把对象放在缓存里(这里的缓存是指ehcache),并且设置永远不过期,这和直接在类里加载到内存有什么区别,比如:我用的是tomcat,那如果我把对象直接放到application里又有什么区别。
期望大牛们为我解答,也欢迎大家讨论一下,如果有表达不清晰的地方可以尽管问。谢谢...