![](/img/trans.png)
[英]org.hibernate.PropertyNotFoundException: Could not find a getter for
[英]org.hibernate.PropertyNotFoundException: Could not find setter for 0
我只使用HQL从表中获取选定的属性,维护非实体类对象的列表。 对于Eg。 我的实体类:
@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 class StudentDTO {
private String name;
// Getter-Setter for name
}
现在用
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;
}
其中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;
}
抛出org.hibernate.PropertyNotFoundException:无法在类上找到0的setter ../StudentDTO
在使用Transformer时引用Hibernate异常PropertyNotFoundException ,我将我的查询更改为"select student.id as id,..."
,在StudentDTO
有Long id
但是抛出相同的异常,说找不到1的setter。
每家酒店都提供吸气/安装。 请建议更改!
在使用AliasToBeanResultTransformer
,必须在query
声明正确的alias
。 类名本身表示它将使用alias
将结果转换为resultClass
。
AliasToBeanResultTransformer
类的transformTuple
方法使用alias
来查找resultClass (StudentDto)
的setter方法:
for (int i = 0; i < aliases.length; i++) {
String alias = aliases[i];
if(alias != null) {
setters[i] = propertyAccessor.getSetter(resultClass, alias);
}
}
为了使AliasToBeanResultTransformer
正常工作,您需要在query
使用正确的别名。 如果StudentDto
类中的属性名称是name
,则应使用select student.name as name
。 使用select student.name as n
将再次抛出异常。 您在query
中使用的alias
应与DTO类中的属性名称相同。
为select子句中的每个字段设置别名,这些字段与您在查询中设置为变换器类的持久性类中的字段名称相同,例如:
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));
...
}
只需按如下所示编写每个列名:从Class_name中选择column_name作为property_name,....
例如:从Student选择student.name 作为名称
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.