Hibernate帮我写查询

时间:2011-11-07 17:14:32

标签: java database hibernate

我在java中制作电子邮件客户端。当用户创建带附件(文档)的邮件时,它会将所有关于电子邮件的数据保存在数据库中,但保存在多个表中,如Document_table.title中的附件标题,msgnumber.num中的邮件数,msgnumber.date中的日期,发件人姓名在Official_Person.name和OfficialPerson.secondname中。 我如何检索所有这些数据并显示它(我使用Jtable为此)?我知道如果数据保存在一个表中而不是多个表中,如何获取数据。请帮帮我。

一种格式有许多documnet。

文件:

@Entity
@Table(name="DOCUMENT"
    ,schema="Default"
)
public class Document implements java.io.Serializable {

@ManyToOne
        @JoinColumn(name = "FormatID")
private Format format;
    @Id
    @Column(name = "DocumentID", unique = true, nullable = false)
    private int documentId;

格式:

@Entity
@Table(name="FORMAT"
    ,schema="Default"
)
public class Format implements java.io.Serializable {


    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "FormatID")
    private Set<Document> documents = new HashSet();

    @Id
    @Column(name = "FormatID", unique = true, nullable = false)
    private int formatId;

format.hbm

<hibernate-mapping>
    <class name="entity2.Format" table="FORMAT">
        <id name="formatId" type="int">
            <column name="FormatID" length="2000000000" />
            <generator class="native" />
        </id>
                <set name="documents" table="DOCUMENT"
                inverse="true" lazy="true" fetch="select">
            <key>
                <column name="FormatID" not-null="true" />
            </key>
            <one-to-many class="entity2.Document" />
        </set>

document.hbm

<hibernate-mapping>
    <class name="entity2.Document" table="DOCUMENT">
        <id name="documentId" type="int">
            <column name="DocumentID" length="2000000000" />
            <generator class="native" />
        </id>

        <many-to-one name="format" class="entity2.Format" fetch="select">
            <column name="FormatID" not-null="true" />
        </many-to-one>

我想检索格式1的所有文档:

Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        Format f = (Format) session.get(Format.class, 1);
System.out.println(f.getName());
        System.out.println(f.getDocuments());

文件是空的?我哪里错了?

3 个答案:

答案 0 :(得分:1)

您只需使用select语句为您要检索的所有值编写查询。 Hibernate将返回一个数组,其中的索引值与select语句的顺序相同。

选择 FROM Person AS P,Address AS A,Order AS O,User AS U. 在哪里P.id = 5   AND A.personId = P.id   和O.personId = P.id   和U.personId = P.id

这将返回一个包含{person,address,List,User}

的数组

答案 1 :(得分:1)

Hibernate是一个ORM工具 - “O”代表“对象”。从映射到表和列的电子邮件对象开始。然后使用HQL查询满足特定限制的电子邮件实例。

JTable或网页显示问题与查询对象的方式不同。

答案 2 :(得分:1)

如果您定义类之间的关系,例如:

class Person {    
   @OneToMany(cascade=CascadeType.ALL,
              fetch= FetchType.EAGER)
   private Set<Email> emails = new HashSet();

   // getters/setters and some other attributes are not shown

当您从数据库中读取对象时,您将获得另一个与其自动关联的对象。

Session s = HibernateUtil.getSessionFactory().openSession();
Person p = (Person) s.get(Person.class, 1);
s.close();

System.out.println(p.getName());
System.out.println(p.getEmails());

以下是双向一对一关系的示例。

class Person {
    @OneToOne(cascade=CascadeType.ALL)
    private Address address;


class Address {
    @OneToOne(mappedBy=”address”)
    private Person person