最后更新: 2005-06-17 14:42 (0) (0) 正在投票中... 时间: 2005-06-17 15:06 现在又遇到了一个问题,是关于查询的: 我现在要在页面上显示所有的person信息,包括所属的公司名称,但是我查询时用了hql为: 代码 select p,c.Name from Person as p,Company as c where p.company_id=c.id 问题是我在页面上不知如何显示,查出来得到的list也无法转换到Person[]里去,不知道有什么方法可以解决。 company与person的关系是one-to-many 的关系。 company: 代码 public class Company implements Serializable { /** identifier field */ private String id; /** nullable persistent field */ private String name; private Set employees; /** full constructor */ public Company(java.lang.String name) { this.name = name; } /** default constructor */ public Company() { } public java.lang.String getId() { return this.id; } public void setId(java.lang.String id) { this.id = id; } public java.lang.String getName() { return this.name; } public void setName(java.lang.String name) { this.name = name; } public void setEmployees(Set value) { this.employees=value; } public Set getEmployees() { return employees; } public void addEmployee(hh.Person value) { employees.add(value); } public void removeEmployee(hh.Person value) { employees.remove(value); } public void clearEmployees() { employees.clear(); } public String toString() { return new ToStringBuilder(this) .append("id", getId()) .toString(); } public boolean equals(Object other) { if ( !(other instanceof Company) ) return false; Company castOther = (Company) other; return new EqualsBuilder() .append(this.getId(), castOther.getId()) .isEquals(); } public int hashCode() { return new HashCodeBuilder() .append(getId()) .toHashCode(); } } person代码: 代码 public class Person implements Serializable { /** identifier field */ private String id; /** nullable persistent field */ private String name; /** nullable persistent field */ private String address; /** nullable persistent field */ private String company_id; /** full constructor */ public Person(java.lang.String name, java.lang.String address, java.lang.String company_id) { this.name = name; this.address = address; this.company_id = company_id; } /** default constructor */ public Person() { } public java.lang.String getId() { return this.id; } public void setId(java.lang.String id) { this.id = id; } public java.lang.String getName() { return this.name; } public void setName(java.lang.String name) { this.name = name; } public java.lang.String getAddress() { return this.address; } public void setAddress(java.lang.String address) { this.address = address; } public java.lang.String getCompany_id() { return this.company_id; } public void setCompany_id(java.lang.String companyId) { this.company_id = companyId; } public String toString() { return new ToStringBuilder(this) .append("id", getId()) .toString(); } public boolean equals(Object other) { if ( !(other instanceof Person) ) return false; Person castOther = (Person) other; return new EqualsBuilder() .append(this.getId(), castOther.getId()) .isEquals(); } public int hashCode() { return new HashCodeBuilder() .append(getId()) .toHashCode(); } } (0) (0) 正在投票中... 时间: 2005-06-17 15:37 刚发现网上也有人问类似的问题,顺便把他引进来,我的问题和下面的差不多: 引用 1、项目现在用的是structs和hibernate构架,用eclipse开发。 2、问题出在两张表,一张a,有a.id和a.name属性,另一张b,有b.id, b.a.id和b.property属性(其他属性简略),现在a与b是一对多的关系,即一个a.id对应b中的多个记录。 3、根据系统现状,不合适物理上在数据库把两张表连接成一张表。 4、需要实现的是在前台页面列表显示如下信息:a.id, a.name, b.property1(对应同一个a.id的第一个property值) b.property2, b.property3 …… 4、在structs中,只要传递给前台jsp页面,a.list(a表的记录列表,但是有其特殊格式,比如<id>a.id</id>,同xml的记录格式),再调用iterate就可以自动一行一行显示。a.list的得到,通过from a即可。 5、现在想在同一行不仅显示a.id, a.name也要显示b.property1, b.property2。 6、现在想了一个方法,在后台把a和b做inner join,然后取相应值,再传递前台,但是使用如下语句select from a a.id, a.name, b.property inner join b where a.id = b.a.id出现两个问题,一、用query实现上面的语句,得到的是object对象,不能实现query.list(),这样类型不匹配,不能传给前台(就这个我到现在都没实现,怎么得到需要属性,按照要求的格式的list());二、就算得到了正确的list(),但是因为a.id对应多个b.property,所以对同一a.id来说,有多个记录,这样传到前台的时候,用iterate实现,不是有重复行了么?比如第一行a.1, b.property1,第二行a.2, b.property2,但是实际需要他们在一行显示(因为第一步都没实现,所以第二步更没有仔细考虑)。 7、在网上看见有select new ab(a.id, b.property) from a inner join b where a.id = b.a.id;就是根据inner join新建一张表,虽然可以不在数据库中出现物理表,但是还是要对应永久java类,而且还要在xml里面注册。尝试了一下,也有两个问题,同上。第一个就是通过query执行后,怎么让结果转化为list()返回;第二个还是多条记录的a.id的值重复。 8、我刚接触structs和hibernate不久,所以很多都不明白。请各位指教对以上问题的解决方法,一就是怎么通过hibernate操作数据库,取到希望取的值,而就是怎样利用structs本身的特点,简单实现页面的显示。比较急,因为下周一前就要实现了。在jsp前台中,使用list()传递,然后iterate实现,很方便,所以一直没有想数据显示一行读一次数据库,做一次表之间连接的老方法,似乎这样做的话,就违反了structs和hibernate构架封装、分离的初衷了。但是接触的时间太少,觉得这两个构架的限制太大,特别是hibernate,有一套繁琐的语法规则。应该有其他方式代替query的吧? (0) (0) 正在投票中... 时间: 2005-06-20 09:59 scienceren 写道 现在又遇到了一个问题,是关于查询的: 我现在要在页面上显示所有的person信息,包括所属的公司名称,但是我查询时用了hql为: 代码 select p,c.Name from Person as p,Company as c where p.company_id=c.id 问题是我在页面上不知如何显示,查出来得到的list也无法转换到Person[]里去,不知道有什么方法可以解决。 这时候不是Person[],而是Object[],Object[]中第一个元素为person对象,第二个是公司名(按照你的类定义,可能是字符串或者Name对象). 代码 for(Iterator iter = query.list().iterate();iter.hasNext()){ Object[] row = (Object[])iter.next(); Person person = (Person)row[0]; //假设是Name对象 Name companyName = (Name)row[1]; } 关于Hql你可以查查hibernate文档,这些都有详细说明. (0) (0) 正在投票中... 时间: 2005-10-11 16:38 snowway 写道 举例来说,比如有个Person类 scienceren 写道 第三个问题:同样地,能否用例子说明一下。 假如您有一个从数据库中得到person对象,该person.getName()为"abc" 那么: 代码 Person person = (Person)session.get(Person.class, new Long(1)); //使person变成detached状态 session.evict(person); //重新关联到session,使person变成persist状态 session.lock(person, LockMode.READ); person.setName("abc"); session.update(person); 将不会打印update语句,因为person的所有字段没有改变。那么hibernate如何探测您是否改变字段了呢?那是因为使用了session.lock后,hibernate会在内存中建立person对象的一份快照,当使用session.update后,hibernate会比较person和内存中的快照,用来判断实例属性有没有发生变化,只有发生了变化的字段才会出现在update语句中,本例没有任何属性变化,所以没有update语句产生。 。