org.hibernate.PropertyNotFoundException:无法找到0的setter

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类中的属性名称相同.


jas*_*ngh 5

只需写下每个列名: Select column_name as property_name , ...., from Class_name

例如:从 Student 中选择 student.name作为名称