我正在尝试使用 hibernate 注释从未定义主键的 MySQL 数据库表中获取数据。
然而,事实是该表的 2 列在表中是唯一的。如何使用 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);
我无法从数据库获取所有值。请提出一些解决方案。
最佳答案
再次阅读您的问题后,不确定这是否有帮助。您不能拥有没有主键的表。阅读 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();
关于java - 如何创建 hibernate 复合键并从表中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35970255/