java - @Sort 在 Hibernate 中不起作用

标签 java hibernate

我试图通过一个小例子来了解 Hibernate 中排序的工作原理。我创建了以下实体:

User.java

@Entity
@Table(name = "TB_USER")
public class User {
    @Id
    @GeneratedValue
    private int id;
    private String name;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "CUST_ID")
    @Sort(type = SortType.COMPARATOR, comparator = TicketComparator.class)
    private SortedSet<Ticket> tickets = new TreeSet<Ticket>();

    public User() {
    }

    public User(String name, Ticket...tickets) {
        this.name = name;
        this.tickets.addAll(Arrays.asList(tickets));
    }
}

Ticket.java

@Entity
public class Ticket {
    @Id
    @GeneratedValue
    private int id;
    private String name;
}

比较器类:

public class TicketComparator implements Comparator<Ticket> {
    public int compare(Ticket t1, Ticket t2) {
        return t1.getName().compareTo(t2.getName());
    }
}

测试这个的程序:

    private static void saveUsers() {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.getTransaction().begin();
        User user = new User("User", new Ticket("abc"), new Ticket("xyz"));
        session.save(user);
        session.getTransaction().commit();
    }

private static void showUsers() {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.getTransaction().begin();
        List<User> users = session.createQuery("from User").list();

        for (User user : users) {
            System.out.println(user.getName() + " -- > " + user.getTickets());
        }

        session.getTransaction().commit();
    }

当我运行这个程序时,我收到异常:

Exception in thread "main" java.lang.ClassCastException: org.hibernate.tutorials.Ticket cannot be cast to java.lang.Comparable
    at java.util.TreeMap.put(Unknown Source)
    at java.util.TreeSet.add(Unknown Source)
    at java.util.AbstractCollection.addAll(Unknown Source)
    at java.util.TreeSet.addAll(Unknown Source)
    at org.hibernate.tutorials.hibernate7.five.sorted.User.<init>(User.java:37)
    at org.hibernate.tutorials.hibernate7.five.sorted.AppTest.saveUsers(AppTest.java:33)
    at org.hibernate.tutorials.hibernate7.five.sorted.AppTest.main(AppTest.java:11)

如果我已经提供了 comparator 属性,那么为什么 hibernate 没有选择我的比较器类而是抛出异常。如果我在此示例中遗漏了任何内容,请告诉我?

最佳答案

User user = new User("User", new Ticket("abc"), new Ticket("xyz"));

以上是纯Java代码,与Hibernate无关。您正在创建 User 类(不是 Hibernate)的实例,并用票证(不是 Hibernate)填充它。 TreeSet 初始化为

private SortedSet<Ticket> tickets = new TreeSet<Ticket>();

因此,您正在创建集合而不提供比较器。因此,该集合使用 Ticket 类的自然顺序进行排序。但 Ticket 没有实现 Comparable,因此出现异常。

如果你要求 Hibernate 从数据库中获取一个用户,那么 Hibernate 将创建一个 User 实例,使用注释中提供的比较器将你的 TreeSet 替换为它自己的集合,并且你的票证将被正确排序。

关于java - @Sort 在 Hibernate 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25466392/

相关文章:

java - 使用内部联接的简单 hql 命名查询

sql - 我可以从 JPA 查询对象获取 SQL 字符串吗?

java - 用户双击按钮后在数据库中双重插入

java - 为什么 EL 函数应该来自具有非 void 返回类型的 Java 方法?

c# - Java 到 C# : HashMap, 映射和队列

java - 如何使 NDEF 文本记录人类无法阅读?

java - RandomAccessFile 正确写入文件,但检索记录时失败

java - Hibernate 抛出奇怪的错误 : Class is not mapped

java - 通过防火墙的 VisualVM - RMI 故障排除

java - hibernate 条件和if语句?