Java org.hibernate.PropertyNotFoundException:找不到0的setter
我使用HQL仅从表中提取选定的属性,维护非实体类对象的列表。 例如,我的实体类:Java org.hibernate.PropertyNotFoundException:找不到0的setter,java,hibernate,hql,Java,Hibernate,Hql,我使用HQL仅从表中提取选定的属性,维护非实体类对象的列表。 例如,我的实体类: @Entity @Table(name="STUDENT") public class Student { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; @Column(name="NAME", columnDefinition="TEXT", length="60", nullable
@Entity
@Table(name="STUDENT")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column(name="NAME", columnDefinition="TEXT", length="60", nullable = false)
private String name;
@ManyToOne
@JoinColumn(name = "Dept_id", nullable = false)
private Department department;
// Other fields...
// Getter-Setters
}
而非持久性DTO类的类成员(例如,仅限名称)更少:
现在使用
public List<StudentDTO> getStudents(Long deptId) {
List<StudentDTO> students;
Query query = session.createQuery("select student.name " +
"from Student as student " +
"where Dept_id =?").setResultTransformer(new AliasToBeanResultTransformer(StudentDTO.class));
query.setString(0, Long.toString(deptId));
students = CommonUtil.castList(StudentDTO.class, query.list());
return students;
}
public List getStudents(长deptId){
列出学生名单;
Query=session.createQuery(“选择student.name”+
“从学生到学生”+
“其中Dept_id=?”).setResultTransformer(新别名ToBeanResultTransformer(StudentDTO.class));
query.setString(0,Long.toString(deptId));
students=CommonUtil.castList(StudentDTO.class,query.list());
留学生;
}
其中castList将任何集合转换为ArrayList
public static <T> List<T> castList(Class<? extends T> clazz, Collection<?> c) {
List<T> resultList = new ArrayList<T>(c.size());
for(Object o: c)
resultList.add(clazz.cast(o));
return resultList;
}
公共静态列表castList(c类){
List resultList=newarraylist(c.size());
用于(对象o:c)
结果列表添加(分类铸造(o));
返回结果列表;
}
抛出org.hibernate.PropertyNotFoundException:在类../StudentDTO上找不到0的setter
引用时,我将查询更改为“select student.id as id,…”
,在StudentDTO中有长id
,但会引发相同的异常,表示1未找到setter
为每个属性提供Getter/setter。请建议更改 使用别名作为结果变压器时,必须在查询中声明正确的别名。类名本身表示它将使用别名
名称将结果转换为您的resultClass
AliasToBeanResultTransformer
类的transformTuple
方法使用alias
名称查找resultClass(StudentDto)
的setter方法:
for(int i=0;i
为了使aliastobeansulttransformer
正常工作,您需要在查询中使用正确的别名。如果StudentDto
类中的属性名为name
,则应使用选择student.name作为name
。使用选择student.name作为n
将再次引发异常。在查询中使用的别名
名称应与DTO类中的属性名称相同 为select子句中的每个字段设置别名,这些字段与查询中设置为transformer类的持久性类中的字段名相同,例如:
public mypersistenceclass()
{
// define constructor
public mypersistenceclass(){}
private String username;
// define setter and getter
}
public userclass()
{
...
Query query = session.createQuery("select Users.username as username ...")
.setResultTransformer(new AliasToBeanResultTransformer(mypersistenceclass.class));
...
}
只需按如下所示写出每一列名称:
从类名称中选择列名称作为属性名称
例如:从学生中选择student.name作为name
明显的问题是缺少别名。尝试“选择student.name作为name”,你能发布完整的堆栈吗?
for (int i = 0; i < aliases.length; i++) {
String alias = aliases[i];
if(alias != null) {
setters[i] = propertyAccessor.getSetter(resultClass, alias);
}
}
public mypersistenceclass()
{
// define constructor
public mypersistenceclass(){}
private String username;
// define setter and getter
}
public userclass()
{
...
Query query = session.createQuery("select Users.username as username ...")
.setResultTransformer(new AliasToBeanResultTransformer(mypersistenceclass.class));
...
}