hibernate:无法在类上找到合适的构造函数

时间:2012-09-11 06:24:46

标签: java hibernate

这是我的班级:

public class TrainLate {

private int id;
private Date startDate;
private Date endDate;
private Set<TrainSchedule> ts=new HashSet<TrainSchedule>(); 
public TrainLate(){}
public TrainLate(int id, Date startDate, Date endDate) {
    super();
    this.id = id;
    this.startDate = startDate;
    this.endDate = endDate;
}

    // setters and getters...
}

日期类型为java.sql.Date

在另一个班级我使用HQL:

String hql="SELECT new TrainLate(id,startDate,endDate) FROM TrainLate "+                "WHERE id="+String.valueOf(index);

其中index是一个int参数。

这是“TrainLate.hbm.xml”:

<class name="classes.TrainLate">
    <id name="id">
        <generator class="native"/>
    </id>
    <property name="startDate"/>
    <property name="endDate"/>
    <set name="ts"  lazy="false" cascade="all-delete-orphan" inverse="true">
           <key column="trainLateID" />
           <one-to-many class="classes.TrainSchedule" />
          </set>  
</class>

以下是例外:

Unable to locate appropriate constructor on class [classes.TrainLate] [SELECT new TrainLate(id,startDate,endDate) FROM classes.TrainLate WHERE id=0]

“class”是包名。

2 个答案:

答案 0 :(得分:3)

首先:Hibernate要求你的实体有一个默认的无参数构造函数。

第二:你的hql应该是:"from TrainLate t where t.id = :id"

String hql = "from TrainLate t where t.id = :id";
List<TrainLate> result = (List<TrainLate>) session.createQuery(hql).setParameter("id", 1).list();

甚至更好。当您知道实体的ID时,您不需要使用hql搜索:

TrainLate t = session.get(TrainLate.class, 1L); // I assume your id is a Long

如果找不到实体,则返回null

TrainLate t = session.load(TrainLate.class, 1L); // I assume your id is a Long

如果找不到实体,则会抛出ObjectNotFoundException

答案 1 :(得分:1)

我知道这听起来很傻,但你试过调试这件事吗?

我的第一个想法是(如果我是休眠:))用No-OP构造函数创建一个TrainLate对象,然后调用一系列setter来设置id,startDate和endDate。

我在你的代码片段中没有看到它......