从bigint转换为long时,如何从表中获取hibernate中的long值列表

时间:2017-12-04 08:59:20

标签: java sql hibernate hql hibernate-native-query

使用getEvents方法时出现以下异常:

  

org.hibernate.MappingException:未知实体:java.lang.Long

public List<Long> getEvents(Person person) {

    String q = "select new java.lang.Long(te.event_id) "
        + "from teachers_event te"
        + "where te.teachers_id = :personId ";
    Query query = entityManager.createNativeQuery(q, Long.class);
    query.setParameter("personId", person.getId());
    return (List<Long>) query.getResultList();
}

数据库中的teachers_event表将教师的ID与事件相关联。我没有将此表映射到实体。我只想从中获取ID。 PostgreSQL表中的ID为bigint。 有没有办法实现它而不需要单独的类来映射TeacherEvents实体?

1 个答案:

答案 0 :(得分:0)

在JPA 2.1中,有一个名为&#34;结果集映射&#34;。

的功能

基本上你必须定义一个保存结果值的POJO类(必须使用构造函数传递所有值):

public class IdResult{

    private Object id;

    public IdResult(Object id){
        this.id = id;
    }

     public Long getLongId(){
        return (Long)id;
     }
}

然后你必须在你的一个实体上声明映射(无关紧要,它只需要是一个declated @Entity):

@SqlResultSetMapping(name="IdMapping", classes = {
    @ConstructorResult(targetClass = IdResult.class, 
    columns = {@ColumnResult(name="id")})
})

您必须在查询中使用别名来匹配@ColumnResult名称:

select te.event_id as id
...

最后用于查询创建:

Query query = entityManager.createNativeQuery(q, IdMapping.class);
return (List<IdResult>) query.getResultList();

然后在您的服务层中,您只需使用getLongId();