【问题标题】:Hibernate query with an alias带有别名的休眠查询
【发布时间】:2016-03-10 08:48:29
【问题描述】:

怎么了

session.createCriteria(Composed.class, "main")
.createAlias("main.id.branch", "b1")
.add(Restrictions.eq("b1.owner", user))
.list();

?相应的 HQL 工作正常

String hql = "select main from Composed as main"
        + "left join main.id.branch as b1 where b1.owner = ?";
session.createQuery(hql)
.setInteger(0, user.id().intValue())
.list();

根据标准,Hibernate 不创建连接并使用where b1x1_.owner_id=?,但任何地方都没有b1x1_,因此它失败并显示“无法准备语句”。

这些类相当琐碎

@Entity class Composed {
    @Id ComposedId id; // also tried @EmbeddedId
    ... irrelevant stuff
}

@Embeddable class ComposedId {
    @ManyToOne(optional=false) Branch branch;
    ... irrelevant stuff
}

@Entity class Branch {
    @Id Integer id;
    @ManyToOne(optional=false) User owner;
    ... irrelevant stuff
}

@Entity class User {
    @Id Integer id;
    ... irrelevant stuff
}

更新

我终于创建了一个SSCCE 并提交了一个issue。抱歉这个令人困惑的问题,没有 SSCCE,很难重现。

【问题讨论】:

  • 不确定,但您是否尝试过分步创建别名?先说 main.id=x1 然后 x1.branch= x2 等等。?
  • @Forkmohit 现在,我做到了。恕我直言,main.id 是嵌入的,因此不需要别名,但我已经尝试过了。我也尝试为 main.id only 和 whatelse 创建别名。
  • 你能试试Restrictions.eq("b1.owner.id", user.id().intValue())吗?您能否也分享整个生成的 SQL 和错误消息。
  • 你是不是缺少Branch 类中Use owner;[sic] 字段的映射?
  • 你使用的是什么休眠版本?使用问题中的注释类,我什至无法创建 SessionFactory。我收到以下异常:INFO:HHH000400:使用方言:org.hibernate.dialect.HSQLDialect org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1499) 的线程“main”java.lang.NullPointerException .hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1422) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)

标签: java hibernate criteria


【解决方案1】:

由于Branch 是映射的Entity,因此您需要一个子条件来代替别名。

session.createCriteria(Composed.class, "main")
    .createCriteria("main.id.branch", "b1")
    .add(Restrictions.eq("b1.owner", user))
    .list();

【讨论】:

  • 不知道,如果这真的有帮助,现在没有时间尝试,但赏金很快就会到期。您能否详细说明我需要子标准的原因?
  • 你说Hibernate creates no join这是你没有指示hibernate这样做的结果。当您创建子标准时,您会强制休眠来创建连接。我还没有使用embeddable 的经验,但我认为它们的行为与components 相同。我也没有测试它,但写下了我是如何做到的。不要急于获得赏金,如果它过期了。
  • 不幸的是,它也不起作用。我想,与此同时,我已经尝试了所有可能性。我很遗憾使用了组合 ID,因为 Hibernate 在这方面被破坏了。我什至用 hibernate-jpamodelgen 尝试过 JPA,但它不会为我的 ComposedId 生成任何东西,所以我又迷路了。也许是因为我使用了静态嵌套类。
【解决方案2】:

我没有尝试,但也许用左连接创建两个别名对你有帮助。我的意思是:

session.createCriteria(Composed.class, "main")
   .createAlias("main.id", "id1", JoinType.LEFT_OUTER_JOIN)
   .createAlias("id1.branch", "b1", JoinType.LEFT_OUTER_JOIN)
   .add(Restrictions.eq("b1.owner", user))

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多