java - 使用所询问实体的子实体的信息对 Hibernate Criteria 查询的结果进行排序

标签 java hibernate criteria-api

我有两个实体 Person 和 Book。只有一本书的一个实例存储到系统中(添加一本书时,应用程序会在向数据库添加新行之前检查是否已经找到该书)。实体相关源代码如下:

@Entity
@Table(name="persons")
@SequenceGenerator(name="id_sequence", sequenceName="hibernate_sequence")
public class Person extends BaseModel
{
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_sequence")
    private Long id = null;

    @ManyToMany(targetEntity=Book.class)
    @JoinTable(name="persons_books", joinColumns = @JoinColumn( name="person_id"), inverseJoinColumns = @JoinColumn( name="book_id"))
    private List<Book> ownedBooks = new ArrayList<Book>();
}

@Entity
@Table(name="books")
@SequenceGenerator(name="id_sequence", sequenceName="hibernate_sequence")
public class Book extends BaseModel
{
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_sequence")
    private Long id = null;

    @Column(name="name")
    private String name = null;
}

我的问题是我想找到拥有特定人所拥有的一些书籍的人。返回的人员列表应使用以下逻辑排序:拥有大部分相同书籍的人应该排在列表的第一位,列表的第二个人拥有的书籍数量不如第一个人多,但多于第三人称。下面添加执行此查询的方法的代码:

@Override
public List<Person> searchPersonsWithSimilarBooks(Long[] bookIds) {
    Criteria similarPersonCriteria = this.getSession().createCriteria(Person.class);
    similarPersonCriteria.add(Restrictions.in("ownedBooks.id", bookIds));

    //How to set the ordering?
    similarPersonCriteria.addOrder(null);

    return similarPersonCriteria.list();
}

我的问题是这可以通过使用 Hibernate 来完成吗?如果是这样,如何做到?我知道我可以实现一个比较器,但我更愿意使用 Hibernate 来解决这个问题。

当使用 SQL 时,我想要的结果可以通过使用以下 SQL 查询来实现:

select p.name, count(p.name) as bookCount from persons p, books b, person_book pb
where pb.person_id = p.id and pb.book_id = b.id and b.id in (1,2,3,4,5,6) group by
name order by bookCount desc 

我一直在尝试弄清楚如何将其转换为 Criteria 查询。我一直在尝试使用投影,但我似乎无法将结果映射回 Person 对象。

最佳答案

关于java - 使用所询问实体的子实体的信息对 Hibernate Criteria 查询的结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2614361/

相关文章:

java - 我无法在 Spring boot 应用程序中使用mockito 来模拟 Dao 方法

java - 基于其他两个对象的子类创建一个对象

java - Hibernate:OnDelete 注释问题

java - 标准 API - 分组依据 - 未生成

java - EntityManager 注入(inject) - NullPointerException

java - 在开始 Activity 之前加载资源

java - Android Studio找不到资源且资源链接失败

java - 在 QueryDSL 中使用相同的 q-object 时对象已被使用

java - Hibernate 多对多映射

java - 将 Java 泛型用于带有 WHERE 子句的 JPA findAll() 查询