Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java org.hibernate.PropertyNotFoundException:找不到0的setter_Java_Hibernate_Hql - Fatal编程技术网

Java org.hibernate.PropertyNotFoundException:找不到0的setter

Java org.hibernate.PropertyNotFoundException:找不到0的setter,java,hibernate,hql,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

我使用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 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;
}
public List getStudents(长deptId){
列出学生名单;
Query=session.createQuery(“选择student.name”+
“从学生到学生”+
“其中Dept_id=?”).setResultTransformer(新别名ToBeanResultTransformer(StudentDTO.class));
query.setString(0,Long.toString(deptId));
students=CommonUtil.castList(StudentDTO.class,query.list());
留学生;
}
其中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;
        }
公共静态列表castList(c类){
List resultList=newarraylist(c.size());
用于(对象o:c)
结果列表添加(分类铸造(o));
返回结果列表;
}
抛出org.hibernate.PropertyNotFoundException:在类../StudentDTO上找不到0的setter

引用时,我将查询更改为
“select student.id as id,…”
,在
StudentDTO中有
长id
,但会引发相同的异常,表示1未找到setter


为每个属性提供Getter/setter。请建议更改

使用
别名作为结果变压器时,必须在
查询中声明正确的
别名。类名本身表示它将使用
别名
名称将结果转换为您的
resultClass

AliasToBeanResultTransformer
类的
transformTuple
方法使用
alias
名称查找
resultClass(StudentDto)
的setter方法:

for(int i=0;i

为了使
aliastobeansulttransformer
正常工作,您需要在
查询中使用正确的别名。如果
StudentDto
类中的属性名为
name
,则应使用
选择student.name作为name
。使用
选择student.name作为n
将再次引发异常。在
查询中使用的
别名
名称应与DTO类中的属性名称相同

为select子句中的每个字段设置别名,这些字段与查询中设置为transformer类的持久性类中的字段名相同,例如:

 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));

  ...
  }

只需按如下所示写出每一列名称: 从类名称中选择列名称作为属性名称

例如:从学生中选择student.name作为name


明显的问题是缺少别名。尝试“选择student.name作为name”,你能发布完整的堆栈吗?
for (int i = 0; i < aliases.length; i++) {
                    String alias = aliases[i];
                    if(alias != null) {
                        setters[i] = propertyAccessor.getSetter(resultClass, alias);
                    }
                }
 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));

  ...
  }