Hibernate View视图映射问题
今天遇到了一个 hibernate映射 视图的的问题 。
这里简单的描述一下:
使用hiberante 查询视图。
在Hibernate中所有的实体都必须带有一个主键id 至少一个主键id。
但是一个视图是不存在主键id的, 那么怎么办?
很多人都是喜欢 随便找一个属性作为主键id, 这是不对的。 也是不正确的。
我们来分析一下。
如果使用hiberante的查询语句是 createSqlquery() 类型的语句,也就是sql语句,基本上是没有问题的. 但是你一但使用createQuery hql查询方式或者DetachedCriteria 查询方式就会出现问题.
当你的视图数据有很多条重复的时候, hiberante会根据你设置的视图主键查询。
例如:
当你的视图主键是 名称这个属性(如下)
序列号 名称 内容
1 测试1 内容2
2 测试1 内容3
那么这个时候,hibernate会利用它强大的性能查询 找到第一条记录,然后 发现第一条记录的主键(测试1) 和第二天记录的主键(测试1)相同, hiberante过段的不进行查询了,直接把第第一条数据 拷贝到第二条数据。
查询的结果是:
名称 内容
测试1 内容2
测试1 内容2
也许你会使用hibernate DetachedCriteria的detachedCriteria.setResultTransformer()这个方法设置去掉重复的, 但是这个时候, 已经得不到你想要的数据了。
解决方案:
我们在创建视图的时候 可以把视图的序列号 作为Id, 然后在视图实体里面 加上一个自增字段id 进行映射匹配!
数据库视图 加上序号查询( oracle)
select rownum as id from viewName
完美解决