Hibernate 查询排序与联合主键映射

1.查询排序

(1)数据库排序(推荐)

<map order-by="name ase" >   <!--name的升序,降序desc-->
session.createQuery("  ").uniqueResult()  //返回唯一的对象,前台对象只有一个
<set order-by="name asc">

(2)内存排序

<set sort="natural" >

sort属性值有三种:

  • natural,升序
  • unsorted,不排序
  • 类名,自定义的排序规则,实现Comparator接口,并实现该接口中的compare方法,将类名作为sort属性名。

字符串比较: o1.compareTo(o2);

2.联合主键映射规则:

类中的每个主键属性都对应到数据表中的每个主键列,hibernate要求具有联合主键的实体类:

  • 必须实现Serializable接口
  • 实现hashCoad()、equals(),重写原因hibernate要根据数据库的联合主键来判断某两行记录是否是一样的,若一样,那么就是同一个对象;若不一样,则为不同对象。这反应到程序领域中就是根据hashcoad与equals方法来判断某两个对象是否能够放到诸如set这样的集合中。联合主键实现接口原因,使用get()、load()时,需要先构造出来该实体的对象,并且将查询依旧(联合主键)设置进去,然后作为get()或load()的第二个参数传进去即可。
public class Student implements Serializable
{
    private String name;
    private String cardId;
    private int age;

    @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((cardId == null) ? 0 : cardId.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (cardId == null)
        {
            if (other.cardId != null)
                return false;
        }
        else if (!cardId.equals(other.cardId))
            return false;
        if (name == null)
        {
            if (other.name != null)
                return false;
        }
        else if (!name.equals(other.name))
            return false;
        return true;
    }
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public String getCardId()
    {
        return cardId;
    }
    public void setCardId(String cardId)
    {
        this.cardId = cardId;
    }
    public int getAge()
    {
        return age;
    }
    public void setAge(int age)
    {
        this.age = age;
    }

}
<hibernate-mapping>
    <class name="com.liule.hibernate.Student" table="Student">
        <composite-id>
            <key-property name="cardId" column="cardId" type="string"></key-property>
            <key-property name="name" column="name" type="string"></key-property>
        </composite-id>

        <property name="age" column="age" type="int"></property>

    </class>
</hibernate-mapping>

插入数据:

public static void main(String[] args)
    {
        Student student = new Student();

        student.setAge(10);
        student.setCardId("123");
        student.setName("zhangsan");

        Session session = sf.openSession();
        Transaction ts = null;

查询:

public static void main(String[] args)
    {
        Student studentPrimaryKey = new Student();

        studentPrimaryKey.setCardId(10);
        studentPrimaryKey.setName("zhangsan");

        Session session = sf.openSession();
        Transaction ts = null;
        try
        {
            Student student = (Student)session.get(Student.class,studentPrimaryKey);
            System.out.println(student.getAge());
            System.out.println(studentPrimaryKey.getAge());
            ts = session.beginTransaction();
            ts.commit();
        }
时间: 2024-10-25 19:01:12

Hibernate 查询排序与联合主键映射的相关文章

Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)

Clob:文本大对象,最长4G Blob:二进制数据大对象,最长4G util: public class HibUtil { private static SessionFactory sessionFactory; static{ //获取配置信息 hibernate.cfg.xml Configuration configuration = new Configuration().configure(); //创建一个 ServiceRegistry的实例 //首先获得其标准建造器,此处用

Hibernate(5)—— 联合主键 、一对一关联关系映射(xml和注解) 和 领域驱动设计

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/Annotation) 联合主键 一对一单向外键联合主键(Xml/Annotation) 一对一组件关联(XML/Annotation) 理解组件 领域驱动设计——自动生成数据库脚本 一对一关系的小结 一些出错问题的总结 自动生成数据库脚本 一般在项目开发过程中,我们的习惯是先建好数据库和表,然后在进

hibernate联合主键映射

联合主键用的不是很多,用的时候查到就是. Wife里id和name联合做主键,需要新建一个主键类,WifePK,必须实现Serializable接口,重写hashcode.equals. 在Husband类里用Wife的id和name做外键关联. Wife类: package com.oracle.hibernate; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.pe

hibernate 注解 联合主键映射

联合主键用Hibernate注解映射方式主要有三种: 第一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将 该类注解为@Embeddable,最后在主类中(该类不包含联合主键类中的字段)保存该联合主键类的一个引用,并生成set和get方法,并将该引用注 解为@Id 第二.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,最后 在主类中(该

Hibernate学习笔记_联合主键

复合主键(联合主键):多个字段构成唯一性. 一,xml方式 1. 将联合主键的属性提取出来,重新编写一个StudentPK类(原Student类中的id,name要删除 并新加入属性“StudentPK”) //StudentPK .javapackage com.bjsxt.hibernate; public class StudentPK implements java.io.Serializable{ private int id; private String name; public

《Hibernate学习笔记之三》:联合主键的映射

<Hibernate学习笔记之三>:联合主键的映射 就如在前面所举的例子一样,是使用的id作为唯一的主键,一般情况下我们也只使用唯一的一个属性作为主键,但是在实际中,我们可能会遇到几个属性作为主键的情况,因此,在本篇博文中,就来介绍下,联合主键的映射关系应该如何来做?? 联合主键的映射有两种方式来进行实现. 1.使用映射文件 XXX.bhm.xml 2.使用Annotation Hibernate首先需要使用联合主键的实体类必须实现Serializable接口,即为了使序列能够被序列化进行传输

联合主键的映射运用

1.联合主键的映射规则 1) 类中的每个主键属性都对应到数据表中的每个主键列. Hibernate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode与equals方法,重写这两个方法的原因在于Hibernate要根据数据库的联合主键来判断某两行记录是否是一样的,如果一样那么就认为是同一个对象,如果不一样,那么就认为是不同的对象.这反映到程序领域中就是根据hashCode与equals方法来判断某两个对象是否能够放到诸如Set这样的集合当中.联合主键的实体类实现Se

hibernate联合主键

一. hibernate联合主键类的规则 1. 实现Serializable接口 2. 重写hashCode与equals方法 二.hibernate联合主键的实体类规则原因(与上面规则顺序对应) 1. Hibernate要根据数据库的联合主键来判断某两行记录是否是一样的,如果一样那么就认为是同一个对象,如果不一样,那么就认为是不同的对象.这反映到程序领域中就是根据hashCode与equals方法来判断某两个对象是否能够放到诸如Set这样的集合当中: 2. 使用get或load方法的时候需要先

Spring mvc 联合主键

在数据库中,使用了两个字段来作为联合主键,那么在spring mvc model中需要进行特殊的配置. 以下是之前查资料找的一种配置方式,记录下来,怕以后忘记了 ==================================== 表A:name 和 age 作为联合主键(表A字段有name,age,sex,email) 那么我们需要两个类 PrimaryKey: @Embeddablepublic class PrimaryKey implements Serializable{ priv