尝试从数据库中列出带有简单约束的hibernate条件时出现错误
Criteria criteria = session.createCriteria(Licence.class); criteria.add(Restrictions.eq("gym", gym.getId())); List<Licence> list = criteria.list();
我有两个类:Licence与关联Gym。这两个类正在扩展DataModel,用于管理有关数据版本的信息-(创建和分配,谁和何时)。这两个类具有的重要意义@Inheritance(strategy = InheritanceType.SINGLE_TABLE)。
Licence
Gym
DataModel
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
执照
@Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) public class Licence extends DataModel implements Serializable { private Gym gym; private String licenceType; private String keyCode; private Date expireDate; private ELicenceExpiry expired; public Licence() { } @ManyToOne @JoinColumn(name="gym_id") public Gym getGym() { return gym; } public void setGym(Gym gym) { this.gym = gym; } @Column(name = "licence_type") public String getLicenceType() { return licenceType; } public void setLicenceType(String licenceType) { this.licenceType = licenceType; } @Column(name = "key_code") public String getKeyCode() { return keyCode; } public void setKeyCode(String keyCode) { this.keyCode = keyCode; } @Column(name = "expire_date") public Date getExpireDate() { return expireDate; } public void setExpireDate(Date expireDate) { this.expireDate = expireDate; } @Column(name = "expired") @Enumerated(EnumType.ORDINAL) public ELicenceExpiry getExpired() { return expired; } public void setExpired(ELicenceExpiry expired) { this.expired = expired; } }
健身房
@Entity @Inheritance(strategy= InheritanceType.SINGLE_TABLE) public class Gym extends DataModel implements Serializable{ private String shortName; private String name; private String nip; private String street; private String postCode; private String localization; private String telephone; public Gym(){}; @Column(name="short_name") public String getShortName() { return shortName; } public void setShortName(String shortName) { this.shortName = shortName; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNip() { return nip; } public void setNip(String nip) { this.nip = nip; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } @Column(name="post_code") public String getPostCode() { return postCode; } public void setPostCode(String postCode) { this.postCode = postCode; } public String getLocalization() { return localization; } public void setLocalization(String localization) { this.localization = localization; } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this.telephone = telephone; } }
数据模型
@MappedSuperclass public abstract class DataModel implements Serializable{ protected Long id; protected String editor; protected Date editDate; protected Time editTime; protected int dataState; @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getEditor() { return editor; } public void setEditor(String editor) { this.editor = editor; } @Column(name="edit_date") public Date getEditDate() { return editDate; } public void setEditDate(Date editDate) { this.editDate = editDate; } @Column(name="edit_time") public Time getEditTime() { return editTime; } public void setEditTime(Time editTime) { this.editTime = editTime; } @Column(name="data_state") public int getDataState() { return dataState; } public void setDataState(int dataState) { this.dataState = dataState; } }
的MySQL
CREATE TABLE licence( id INT(5) NOT NULL AUTO_INCREMENT, gym_id int(3), licence_type VARCHAR(10), key_code VARCHAR(10), expire_date DATE, expired INT(1), editor VARCHAR(10), edit_date DATE, edit_time TIME, data_state INT(1) NOT NULL, PRIMARY KEY (id), FOREIGN KEY (gym_id) REFERENCES gym(id) ON DELETE SET NULL ); CREATE TABLE gym( id INT(3) NOT NULL AUTO_INCREMENT, short_name VARCHAR(16) NOT NULL UNIQUE, name VARCHAR(100) NOT NULL, street VARCHAR(100), post_code VARCHAR(6), localization VARCHAR(64), nip VARCHAR(13), telephone VARCHAR(15), editor VARCHAR(10), edit_date DATE, edit_time TIME, data_state INT(1) NOT NULL, PRIMARY KEY (id) );
例外:
org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of pl.fitpartner.model.DataModel.id at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:192) at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:346) at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4746) at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4465) (...) Caused by: java.lang.IllegalArgumentException: java.lang.ClassCastException@37bd68c3 at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:169) ... 28 more
我做错了什么?
尝试使用
criteria.add(Restrictions.eq("gym", gym));
也就是说,您将代替放置gym为第二个参数。criteria.add``gym.getId()
gym
criteria.add``gym.getId()