我正在尝试使用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获取所有值。请提出一些解决方案。
答案 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();