如何创建hibernate组合键并从表中获取值

时间:2016-03-13 12:29:38

标签: java mysql hibernate

我正在尝试使用hibernate注释从MySQL数据库表中获取数据,该表没有定义主键。

然而,事实上该表的两列在表中是唯一的。如何使用hibernate注释实现相同的目的?

这是我的代码

@Entity
@Table(name = "coc_order_view")
public class CoCOrderDetailsTest {

@EmbeddedId
private MyJoinClassKey key;

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

some other columns and their getters and setters .....

@Embeddable
public class MyJoinClassKey implements Serializable {

private static final long serialVersionUID = -5L;

@Column(name = "product_id")
private int productId;

@Column(name = "order_id")
private int orderId;

gettes and setters....

这是我的标准查询

Criteria criteria = getHibernatetemplate().getSession().createCriteria(CoCOrderDetailsTest.class);
criteria.add(Restrictions.eq("status", "New"));
ArrayList<CoCOrderDetailsTest> orderDet = (ArrayList<CoCOrderDetailsTest>) getHibernatetemplate().get(criteria);

我无法从db获取所有值。请提出一些解决方案。

1 个答案:

答案 0 :(得分:0)

再次阅读您的问题后,不确定这会有所帮助。你没有没有主键的表。阅读this article

中的前几段

也就是说,如果您可以更改表并在这些字段上添加主键,则需要将@IdClass注释添加到CoCOrderDetailsTest的类签名中,然后在类中删除@embeddable和@embeddedId表示法。

另一种选择,如果你可以在表中添加一个字段,那就是在添加的主键字段上使用@GeneratedValue,当然用@Id注释它。

如果您无法更改表格,则无法使用JPA,您必须使用JDBC。

请参阅http://docs.oracle.com/javaee/5/api/javax/persistence/IdClass.html

一个工作示例:

@Entity
@Table(name = "player_game_log")
@IdClass(PlayerGameLogId.class)
public class PlayerGameLog {

@Id
@Column(name = "PLAYER_ID")
private Integer playerId;

@Id
@Column(name = "GAME_ID")
private String gameId;
....

和id类(注意id类没有注释)....

public class PlayerGameLogId implements Serializable {

private static final long serialVersionUID = 1L;
private Integer playerId;
private String gameId;

尝试:

String hql = "FROM CoCOrderDetailsTest WHERE status = :status";
Query query = session.createQuery(hql);
query.setParameter("status","New");
List results = query.list();

我通常使用EntityManager而不是session,所以我不熟悉这种语法 - 我通常会在列表中添加一个类型来返回 - 比如:

List<CoCOrderDetailsTest> results = query.list();