- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我使用 HQL 从表中仅提取选定的属性,维护非实体类对象的列表。对于例如。我的实体类:
@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:无法在类 ../StudentDTO 上找到 0 的 setter
引用 Hibernate exception PropertyNotFoundException when using Transformer ,我将查询更改为 "select student.id as id,..."
,在 StudentDTO
中有 Long id
但抛出相同的异常,说找不到 1 的 setter。
每个属性都有 Getter/Setter。请提出更改建议!
最佳答案
当你使用 AliasToBeanResultTransformer
, 你必须声明适当的 alias
你的名字 query
.类名本身表示它将把结果转换成你的 resultClass
使用 alias
名字。
transformTuple
AliasToBeanResultTransformer
的方法|类使用 alias
名称以查找 resultClass (StudentDto)
的设置方法:
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
将再次抛出异常。 alias
您在 query
中使用的名称应与 DTO 类中的属性名称相同。
关于java - 组织.hibernate.PropertyNotFoundException : Could not find setter for 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18744512/
我是一名优秀的程序员,十分优秀!