java - 组织.hibernate.PropertyNotFoundException : Could not find setter for 0

标签 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 = 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/

相关文章:

java - Jsoup:检查 <div> 是否有 ID 的最佳方法

java - 清除 Hibernate 二级缓存

java - HQL:LIKE 在空关系中

nhibernate - 如何将带有分组依据的HQL转换为QueryOver?

hibernate - JPQL 中的索引元素访问

java - 推土机+ Spring : MappingException: Dozer Bean Mapper is already initialized

java - 从 Java 字符串中去除前导和尾随空格

java - EJB 3 CMT 如何在没有回滚子事务的情况下回滚第一个事务?

java - 从 persistence.xml 注入(inject) PersistenceContext

hibernate - jhipster - 禁用 hibernate 二级缓存