有一个oracle表,功能类似于论坛中的一个主题结构:
create table topic (
    id integer primary key, -- 主键
    title nvarchar2(100), -- 标题
    content nvarchar2(2000), -- 内容
    adddate date, -- 创建时间
    photo1 blob, -- 保存第一张二进制图片数据
    photo2 blob, -- 保存第二张二进制图片数据
    photo3 blob, -- 保存第三张二进制图片数据
    photo4 blob -- 保存第四张二进制图片数据
);因为当在一个列表中显示信息时,是不需要把图片数据取出来的,否则对内存是很大的浪费。因此我写了两个实体类:Topic和TopicDigest,其中的 Topic 把表中所有字段都对应封装起来,而 TopicDigest 则忽略了图片数据,但是多了一个 photoCount 的属性,用于指示一个主题实际上传了多少张图片对于 TopicDigest 如果是在pl/sql中,要想得到 photoCount 值,我可以这样查询:select id, title, content, adddate, 
  (case when photo1 is null then 0 else 1 end)
  + (case when photo2 is null then 0 else 1 end)
  + (case when photo3 is null then 0 else 1 end)
  + (case when photo4 is null then 0 else 1 end)
  as photoCount
from topic可以得到一条记录中图片的数量那么这个办法如果在 hibernate 中实现?

解决方案 »

  1.   

    用qbc多简单,Topic对象的photo1、2、2、3、4四个属性值哪个不为空就把哪个当条件加进去,最后返回来的list的size不就是photoCount吗?
      

  2.   

    用qbc多简单,Topic对象的photo1、2、2、3、4四个属性值哪个不为空就把哪个当条件加进去,最后返回来的list的size不就是photoCount吗
      

  3.   

    但是这样一来,Topic 实体类就要定义 Photo1、Photo2、Photo3、Photo4 这四个属性。这样在进行查询的时候必然会把一条记录的这四个二进制数据读出来。系统对 Topic 表的查询是非常频繁的,并且绝大多数的查询是用不到这四个字段中的数据,而只需要知道它们是否为空就可以了。否则对服务器的内在是非常大的浪费。
      

  4.   

    直接用native sql
    或者当用户保存或者删除topic或者删除photo1 、2、3、4的时候 
    你手动更新photoCount,第一次添加的时候+1,删除的时候-1,
    你要知道你每次添加或者删除的图片张数
    如果你最频繁的操作时查询
      

  5.   


    你的办法应该可行
    不过可能会带来其它方面的麻烦。比如两三个人开发同一个项目,或者将来有别的人接手这个项目时,忘记在适当的时机去更新 phtocount 字段,这将会造成数据不一致
      

  6.   

    感谢前面几位朋友的意见比较来比较去,还是觉得自己写 DAO 模块好一点,虽然工作量大了点,但是什么事都可以由自己掌握另外,我觉得 hibernate 做网站不太合适,可能会产生性能问题,用它做信息管理还是很不错的