【问题标题】:Using hibernate criteria query for joining a not directly referenced entity使用休眠条件查询加入未直接引用的实体
【发布时间】:2014-10-29 13:45:56
【问题描述】:

我想使用与另一个实体的连接对一个实体运行条件查询。但是从 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 ... 

现在我想查询 Cats with Restrictions 和 OrderBy 的 Kitten。

session.createCriteria(Cat.class)
   .createAlias(???? , "kitten")
   .add( Restrictions.like( "kitten.name", "name_of_a_kitten" )
   .addOrder( Order.asc( "kitten.name" ) ) 
   .list();

首先我想到了使用子查询,但我找不到用于排序的解决方案,而且子查询在我看来不像别名那样可读。

Cat 无法更改,因此可能无法更改为双向。

我怎样才能完成查询?

顺便说一句。我正在使用休眠 4.2。

【问题讨论】:

    标签: java hibernate criteria hibernate-criteria


    【解决方案1】:

    我认为通过简单的休眠条件查询不可能达到您的要求。

    Criteria API 只能“选择”根实体,并且您需要 Cat 作为根实体。不幸的是,Cat 实体没有引用 Kitten,因此无法加入它。

    在我看来,你只有两个选择:

    1) HQL

    如果您没有固定到标准 api,只需使用 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) 从 Kitten 集合中显式提取 Cat

    选择要收集的小猫

    final List<Kitten> kittens = session.createCriteria(Kitten.class)
                        .add(Restrictions.like("name", "name_of_a_kitten"))
                        .addOrder(Order.asc("name"))
                        .list();
    

    并转换为 cat 集合,例如使用 lambda-j (OnToOne 关系不是惰性的,所以加载了 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      • 2016-05-02
      • 2014-09-24
      相关资源
      最近更新 更多