Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用hibernate条件查询连接非直接引用的实体_Java_Hibernate_Criteria_Hibernate Criteria - Fatal编程技术网

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

我想使用与另一个实体的联接对一个实体运行条件查询。但是从Java/Hibernate的角度来看,没有对第二个实体的引用,从第二个实体到第一个实体只有一个

为了让人理解,这里有一个被猫化的情况:

===== 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