休眠。如何使用Criteria从联接表中进行查询?

时间:2015-04-08 12:51:05

标签: java hibernate

我有2张桌子:

|shops        |       |discounts    |
|-------------|       |-------------|
|id           |       |id           |
|name         |       |title        |
                      |shop_id      |

*UML Diagram

实体:

@Entity
@Table(name = "shops")
public class Shops {
  @Id
  @GeneratedValue
  @Column(name="id", unique=true, nullable=false)
  protected Integer id;

  @Column(name="name", length=45, nullable=false)
  protected String name;

  @OneToMany(fetch = FetchType.LAZY, mappedBy = "shop")
  private Set<Discounts> discounts = new HashSet<Discounts>(0);
        //getters & setters
}

@Entity
@Table(name="discounts")
public class Discounts {
@Id
  @GeneratedValue
  @Column(name="id")
  private Integer id;

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

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "shop_id", nullable = false)
  private Shops shop;
        //getters & setters
}

我需要收到属于使用标准的商店的所有折扣。我尝试如下:

Criteria cr = session.createCriteria(Discounts.class);
cr.add(Restrictions.eq("id", shop.getLocality()));
List<Discounts> discounts = cr.list();

但是我收到了一个错误:

java.lang.ClassCastException: exmp.entity.Discounts_$$_jvste43_1 cannot be cast to java.lang.Integer

如何解决此错误?

2 个答案:

答案 0 :(得分:0)

你可以这样做:

Criteria cr = session.createCriteria(Discounts.class);
cr.add(Restrictions.eq("shop", shop)); //assuming shop is an object of Shops
List<Discounts> discounts = cr.list();

这会在内部将id的{​​{1}}列映射到Shops的{​​{1}}列,以检查约束并返回结果。

答案 1 :(得分:0)

文档说idEq适用于标识符属性。

https://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/criterion/Restrictions.html#idEq(java.lang.Object)

相反,你可以尝试这样的事情:

Criteria cr = session.createCriteria(Discounts.class);
cr.createAlias("shop","shop") 
cr.add(Restrictions.eq("shop.id",<yourid>));

但如果您只是加载一个带有ID的商店,那么您将获得该商店的所有折扣,因为您有双向关系。

Criteria cr = session.createCriteria(Shops.class);
cr.add(Restrictions.idEq(<yourid>));