Java 使用hibernate条件查询连接非直接引用的实体
我想使用与另一个实体的联接对一个实体运行条件查询。但是从Java/Hibernate的角度来看,没有对第二个实体的引用,从第二个实体到第一个实体只有一个 为了让人理解,这里有一个被猫化的情况:Java 使用hibernate条件查询连接非直接引用的实体,java,hibernate,criteria,hibernate-criteria,Java,Hibernate,Criteria,Hibernate Criteria,我想使用与另一个实体的联接对一个实体运行条件查询。但是从Java/Hibernate的角度来看,没有对第二个实体的引用,从第二个实体到第一个实体只有一个 为了让人理解,这里有一个被猫化的情况: ===== Cat.java ===== @Id private long id; @Column( unique = true, nullable = false ) private String name; ===== Kitten.java ===== @Id private long id
===== Cat.java =====
@Id private long id;
@Column( unique = true, nullable = false )
private String name;
===== Kitten.java =====
@Id private long id;
@Column( unique = true, nullable = false )
private String name;
@OneToOne(optional = false)
private Cat mother; //only one child per mother ...
现在我想查询猫的限制和小猫的订购
session.createCriteria(Cat.class)
.createAlias(???? , "kitten")
.add( Restrictions.like( "kitten.name", "name_of_a_kitten" )
.addOrder( Order.asc( "kitten.name" ) )
.list();
首先,我想到了使用子查询,但我找不到排序的解决方案,而且子查询在我看来不像别名那样可读
Cat无法更改,因此可能无法更改为双向性
我怎样才能完成查询
顺便说一句,我使用的是hibernate 4.2。我认为通过简单的hibernate条件查询不可能达到您的要求 Criteria API只能选择根实体,并且您需要一个Cat作为根实体。不幸的是,Cat实体并没有对Kitten的引用,所以不可能加入它 在我看来,你只有两个选择: 1 HQL 如果您没有固定到CriteriaAPI,只需使用hql即可
final List<Cat> cats = session.createQuery("select c from Kitten k join k.mother c where k.name=:name order by k.name")
.setParameter("name", "name_of_a_kitten").list();
2明确地从小猫集合中提取猫
选择要收集的小猫
final List<Kitten> kittens = session.createCriteria(Kitten.class)
.add(Restrictions.like("name", "name_of_a_kitten"))
.addOrder(Order.asc("name"))
.list();
并转换为cat集合,例如使用lambda-j ONTONE关系不是惰性的,因此加载cat
final List<Cat> cats = extract(kittens, on(Kitten.class).getMother());
子查询
正如您所注意到的,使用子查询是没有用的,因为无法按Kitten属性排序
final DetachedCriteria q = DetachedCriteria.forClass(Kitten.class)
.createAlias("mother", "c")
.add(Restrictions.like("name", "name_of_a_kitten"))
.setProjection(Projections.property("c.id"));
final List<Cat> cats = session.createCriteria(Cat.class)
.add(Property.forName("id").in(q)).list(); //not possible order by Kitten attributes