java - 带别名的 Hibernate 查询

标签 java hibernate criteria

怎么了

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_,因此失败带有“无法准备声明”。

类(class)很简单

@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,很难重现。

最佳答案

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

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

希望对您有所帮助!

关于java - 带别名的 Hibernate 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34104961/

相关文章:

mysql - JPA 实体未保存在数据库中

java - jodatime 的 hibernate 自定义类型(版本冲突?)

hibernate - JPA OneToOne 关联,其中 2 个实体使用复合主键但使用不同的列名?

java - 仅在 Windows 上运行单元测试

java - 您知道是否可以在 Android 中(在 Android 手机中)编译 libgdx 而无需在 native JAVA 中编译它吗?

java - C 到 Java 的代码转换

java - 相同输入不同输出..时间计算

mysql按列A搜索重复项并按其他列的条件删除

java - Hibernate criteria.list 带有引号和重音符号的不良结果

java - 在 mysql 表 hibernate 中的枚举列上执行条件查询时出错