编程语言
首页 > 编程语言> > java – 使用所请求实体的子实体的信息对Hibernate Criteria查询的结果进行排序

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

作者:互联网

我有两个实体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查询.我一直在尝试使用Projections,但我似乎无法将结果映射回Person对象.

解决方法:

这有用吗?

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html#querycriteria-ordering

标签:java,hibernate,criteria-api
来源: https://codeday.me/bug/20190701/1343082.html