【问题标题】:Hibernate criteria one-to-many with embedded tableHibernate 标准一对多与嵌入式表
【发布时间】:2012-05-07 09:15:47
【问题描述】:

我有表 A、B、C,其中 B 是添加列的关联表

|一个 | 1 .. * |乙| * .. 1 | C |

实体 A 和 B 实体列表

@Entity
@Table(name = "a")
public class A {
    //id

    @OneToMany(mappedBy="bPK.a", cascade={CascadeType.ALL})
    private List<B> listB; 

    // getters, setters
} 

实体 B 已嵌入 PK

@Entity
@Table(name = "b")
public class B {
    @EmbeddedId
    private BPK bPK; 

    // added columns
    // getters, setters
}

嵌入式主键类:

@Embeddable
public class BPK implements Serializable {
    private static final long serialVersionUID = 1L;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="i_a", nullable=false)
    private A a;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="i_c", nullable=false)
    private C c;

    // getters, setters
}

实体 C

@Entity
@Table(name = "c")
public class C {
    @Column(name = "i_c")
    private Long iC;

    @Column(name="name")
    private String name; 

    // getters, setters
}

...我想获得这样的对象 A,其中对象 C 与具体名称相关联

我尝试过这样做,但它不起作用

Criteria criteria = session.createCriteria(A.class);  
criteria.createAlias("listB", "bList")
criteria.add(Restrictions.like("bList.bPK.c.name", "name", MatchMode.ANYWHERE));

我有以下异常:

org.springframework.orm.hibernate3.HibernateQueryException:无法解析属性:bPK.c.name

谢谢你的帮助

【问题讨论】:

  • 你有没有找到解决这个问题的方法?你是用 HQL 的吗?
  • 谢谢,我最终也是这样做的......

标签: hibernate hibernate-criteria


【解决方案1】:

这个问题似乎被报告为一个错误。

https://hibernate.atlassian.net/browse/HHH-6963

【讨论】:

    【解决方案2】:

    你得到这个的原因是Hibernate在你的bList (A class)中寻找列bPk.c.name,显然没有这样的列。您想要实现的目标可以通过我的多个别名来完成(在创建别名时,Criteria 也在您当前的表上与该表进行连接)。

    因此:

    Criteria criteria = session.createCriteria(A.class);  
    criteria.createAlias("listB", "bList")
        .createAlias("bList.bPk", "bPk")
        .createAlias("bPk.c", "c")
        .add(Restrictions.like("c.name", "name", MatchMode.ANYWHERE));
    

    我认为 MatchMode.ANYWHERE 不是必需的。

    【讨论】:

    • 感谢您的回复,但还是不行。但现在我得到了另一个异常:org.springframework.dao.InvalidDataAccessResourceUsageException: Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column 'c3_.name' in 'where clause'
    • org.springframework.dao.InvalidDataAccessResourceUsageException:原因:com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:'where 子句'中的未知列'c3_.name'
    • c3_.name 中的3 来自哪里?
    • 我认为休眠索引会以某种方式出现别名。在我发送这篇文章之前,我曾用别名尝试过这种方式,但它没有用。当我从 B 实体中丢弃嵌入的主键并将索引属性保留为非 id 列时,它可以正常工作。所以我猜问题出在嵌入式表的某个地方。
    • 你可能是对的。我也很想知道这个问题的解决方案。不过,对不起,我无法提供任何帮助。
    【解决方案3】:

    我试图找到一种方法来引用 @CollectionTable 中的集合元素,并使用休眠标准一整天!最后我找到了这个:

    ElementCollection createAlias in hibernate API

    我需要在集合中引用一个基本元素(整数),希望它也适用于非基本元素。万一有人像我一样迷路了,不要放弃转向HQL,因为有解决办法!!! :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-28
      • 2011-10-08
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多