hibernate中一个可怕的问题

左潇龙
博客专家认证
2011-09-03 05:10:48
我的数据库只有三十多条数据,然而我的运行结果却是80多条,其中其实应该只有三个的,但差出来的list却有80多个元素,其中除了三个正确的以外,全是null值。
具体如下(get和set方法省略):
public class District {
private int districtId;
private String districtName;
private List<House> Houses = new ArrayList<House>();
}
public class House {
private long houseId;
private long userId;
private int typeId;
private String title;
private String description;
private double price;
private Date pubDate;
private double floorage;
private String contact;
private int districtId;
private int streetId;
private District district;
private Street street;
private Type type;
}
这是两个实体类,分别对应数据库两个表,house表和district表,house类的列比较多,其他的可以不关注,其中的districtId是二者的联系所在,house中的districtId字段是district表的外键。
然后我用session的get方法加载一个district对象,比如id为1,那么我获得这个District对象的houses属性,应该便是house表中,所有districtId这个字段为1的house信息对吧。
但是问题出来了,程序不报错,一切正常,就连show出来的sql语句我都看不出任何毛病,但是查出来的数据就是不对。
具体错误就如上所说,原本应该查出来三个就对了,结果house表一共才30多个数据,我一迭代,一下出来80多个,而且除了那正确的3个意外,全是null值,这是怎么回事。
求解!
...全文
1185 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
对应于数据表的实体类神马的其实很讨厌。
gshhunter 2011-09-05
  • 打赏
  • 举报
回复
检查sql语句,不同排序方式会有多个结果
FooKO 2011-09-05
  • 打赏
  • 举报
回复
LU GUO
kitencx 2011-09-04
  • 打赏
  • 举报
回复
- -!用Query对象的setMaxResults(10),只查10条记录。
左潇龙 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 kitencx 的回复:]
order by属性就是表示你期望取出来的值按照什么进行排序,如果你要按照id进行排序的话,就
order by="id asc",id表示你期望的排序依据,asc只升序,默认是asc,降序是desc
[/Quote]
确实牛B! 但是set貌似不能截取 我的项目要求是 显示最后更新的10个数据
换句话说 我不仅需要按时间排序(这个功能用set已经完美实现!非常感谢兄弟!) 但是我要截取头10个元素 这个好像set我没找到合适的方法 有没有这个方法呢?
kitencx 2011-09-04
  • 打赏
  • 举报
回复
order by属性就是表示你期望取出来的值按照什么进行排序,如果你要按照id进行排序的话,就
order by="id asc",id表示你期望的排序依据,asc只升序,默认是asc,降序是desc
左潇龙 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 kitencx 的回复:]
- -!用Query对象的setMaxResults(10),只查10条记录。
[/Quote]
老兄 我先睡了 明天再聊
左潇龙 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 kitencx 的回复:]
- -!用Query对象的setMaxResults(10),只查10条记录。
[/Quote]
但是我的方法是这样的,我有User类
user类中有个set属性,这里面是这个用户的所有house类(该用户发布的租房信息)。
项目要求是一进入用户界面,就要显示这个用户最后发布的10条租房信息。
那么我现在就想简单点,我直接用session的get方法传入(User.class , user_id),这样就加载了一个对象User是吧。
然后直接user.(set属性名:houses) 那么就是这个用户发布的所有租房信息了对吧?这是一个set对吧?
然后按照老兄的方法,这个set我按发布的时间排过序了对吧?
OK 结果我得到了
这过程中没用到query 0.0 怎么用query的方法设置呢
老兄说的这个方法我知道,一般用来分页的,但是这个过程中没用到query。。。

PS:这个功能我已经实现了,只是不知道上述的这种方法有没有可能实现,如果可能的话,我会用上面的,因为很简单!
牙痴 2011-09-03
  • 打赏
  • 举报
回复
select houses0_.house_type_id as house3_1_, houses0_.house_id as house1_1_, houses0_.house_id as house1_3_0_, houses0_.house_user_id as house2_3_0_, houses0_.house_type_id as house3_3_0_, houses0_.title as title3_0_, houses0_.description as descript5_3_0_, houses0_.price as price3_0_, houses0_.pubdate as pubdate3_0_, houses0_.floorage as floorage3_0_, houses0_.contact as contact3_0_, houses0_.house_district_id as house10_3_0_, houses0_.house_street_id as house11_3_0_ from HOUSE houses0_ where houses0_.house_type_id=?

public class House {
private long houseId;
private long userId;
private int typeId;
private String title;
private String description;
private double price;
private Date pubDate;
private double floorage;
private String contact;
private int districtId;
private int streetId;
private District district;
private Street street;
private Type type;
}


HQLString = "from xxxx.xxxx.House h where 1=1 and h.district.districtId = ?";

左潇龙 2011-09-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 kitencx 的回复:]
引用 13 楼 zuoxiaolong8810 的回复:
引用 11 楼 kitencx 的回复:
排序的话在添加order by属性,list需要在数据表中有单独的列保存索引

你说的可能可以 这么说的话 只要一个表中的数据我想排序 那么我就必须在这个表中加一列 专门储存position 也就是他的位置是吧 是这个意思吗
请注意 我说的是必须 换句话说 只要想排序 表中就必须加一个索引……
[/Quote]

谢谢 我找到了 可是这个属性写的一般是什么? 比如我的house 我要排序 我写house_id ? 这个表的主键吗?
还是其他随便什么都可以,比如创建日期的那一列,有没有什么规范的用法?
比如一般都用主键 或者都建个index列 专门用来排序什么的?
左潇龙 2011-09-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 kitencx 的回复:]
引用 13 楼 zuoxiaolong8810 的回复:
引用 11 楼 kitencx 的回复:
排序的话在添加order by属性,list需要在数据表中有单独的列保存索引

你说的可能可以 这么说的话 只要一个表中的数据我想排序 那么我就必须在这个表中加一列 专门储存position 也就是他的位置是吧 是这个意思吗
请注意 我说的是必须 换句话说 只要想排序 表中就必须加一个索引……
[/Quote]
你说的set的orderby属性是在哪的? hbm的配置文件里 还是什么玩意? 能不能说具体点 怎么写?
kitencx 2011-09-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zuoxiaolong8810 的回复:]
引用 11 楼 kitencx 的回复:
排序的话在添加order by属性,list需要在数据表中有单独的列保存索引

你说的可能可以 这么说的话 只要一个表中的数据我想排序 那么我就必须在这个表中加一列 专门储存position 也就是他的位置是吧 是这个意思吗
请注意 我说的是必须 换句话说 只要想排序 表中就必须加一个索引列position 是这个意思吗
[/Quote]
不是说要排序就需要这个东西,是你要用List存储就需要这个列,这个列专门存储List的索引值,List不是按照取出来的顺序装进去的,是按照你指定的列的索引装的,就是说你如果有个id是80,那List就将这个作为索引80的值存储,确实的用NULL填充了,好像是这样的,具体我也没研究过,一般都是用SET,在hbm文件的set元素中指定order by属性就可以实现排序功能。
左潇龙 2011-09-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kai27ks 的回复:]
应该是配置错了。你的配置文件里有3个many-to-one。对应的那个表只要有一条记录,就把你此表的所有记录查出。
[/Quote]
对了 配置文件不会错的 这个只是对应其他3个外键而已 跟这个应该没关系的 况且 配置文件要是出错了,应该会报错吧 我的程序不报错 只是结果不对而已
左潇龙 2011-09-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kitencx 的回复:]
排序的话在添加order by属性,list需要在数据表中有单独的列保存索引
[/Quote]
你说的可能可以 这么说的话 只要一个表中的数据我想排序 那么我就必须在这个表中加一列 专门储存position 也就是他的位置是吧 是这个意思吗
请注意 我说的是必须 换句话说 只要想排序 表中就必须加一个索引列position 是这个意思吗
左潇龙 2011-09-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kai27ks 的回复:]
应该是配置错了。你的配置文件里有3个many-to-one。对应的那个表只要有一条记录,就把你此表的所有记录查出。
[/Quote]
这个应该没错的 我觉得还是list的索引 也就是list-index这个有问题
kitencx 2011-09-03
  • 打赏
  • 举报
回复
排序的话在添加order by属性,list需要在数据表中有单独的列保存索引
海里的顽石 2011-09-03
  • 打赏
  • 举报
回复
District类是不是应该这样写啊
public class District {
private int districtId;
private String districtName;
private Houses hourse;
}
kai27ks 2011-09-03
  • 打赏
  • 举报
回复
应该是配置错了。你的配置文件里有3个many-to-one。对应的那个表只要有一条记录,就把你此表的所有记录查出。
左潇龙 2011-09-03
  • 打赏
  • 举报
回复
换成set问题还真解决了,但是这样一来,我想排序怎么整? 有没有个完美点的解决方案?
左潇龙 2011-09-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kitencx 的回复:]
List换成Set试试,估计是你的list-index的问题
[/Quote]
那我想排序呢? 而且我觉得这跟list应该没关系吧? 我觉得应该是查询机制的问题,有没有更深度一点的解释。
加载更多回复(6)

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧