mas*_*asT 4 java hibernate hql
我只使用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
}
Run Code Online (Sandbox Code Playgroud)
非持久性DTO类只有较少的类成员(比如名字):
public class StudentDTO {
private String name;
// Getter-Setter for name
}
Run Code Online (Sandbox Code Playgroud)
现在用
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;
}
Run Code Online (Sandbox Code Playgroud)
其中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;
}
Run Code Online (Sandbox Code Playgroud)
抛出org.hibernate.PropertyNotFoundException:无法在类上找到0的setter ../StudentDTO
在使用Transformer时引用Hibernate异常PropertyNotFoundException,我将我的查询更改为"select student.id as id,..."
,在Long id
内部StudentDTO
但是抛出相同的异常,说找不到1的setter.
每家酒店都提供吸气/安装.请建议更改!
Deb*_*kia 17
在您使用时AliasToBeanResultTransformer
,您必须alias
在您的身份中声明适当的名称query
.类名本身表示它会将结果转换为resultClass
使用alias
名称的结果.
类的transformTuple
方法AliasToBeanResultTransformer
使用alias
名称来查找你的setter方法resultClass (StudentDto)
:
for (int i = 0; i < aliases.length; i++) {
String alias = aliases[i];
if(alias != null) {
setters[i] = propertyAccessor.getSetter(resultClass, alias);
}
}
Run Code Online (Sandbox Code Playgroud)
为了使AliasToBeanResultTransformer
工作正常,您需要在您的中使用正确的别名query
.如果您的StudentDto
班级中的属性名称是name
,您应该使用select student.name as name
.使用select student.name as n
将再次抛出异常.alias
您在其中使用的名称query
应与DTO类中的属性名称相同.
只需写下每个列名: Select column_name as property_name , ...., from Class_name
例如:从 Student 中选择 student.name作为名称
归档时间: |
|
查看次数: |
26281 次 |
最近记录: |