如何在从 bigint 转换为 long 时从 table 获取休眠中的 long 值列表
how to get list of long values in hibernate from the table while casting from bigint to long
我在使用 getEvents
方法时遇到以下异常:
org.hibernate.MappingException: Unknown entity: 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
table将教师id与事件关联起来。我没有将此 table 映射到实体。我只想从中获取 ID。 PostgreSQL table 中的 ID 是 bigint
。
有什么方法可以在不单独 class 映射 TeacherEvents
实体的情况下实现它?
在 JPA 2.1 中有一个名为 "result set mapping" 的功能。
基本上你必须定义一个 POJO class 来保存结果值(所有值都必须使用构造函数传递):
public class IdResult{
private Object id;
public IdResult(Object id){
this.id = id;
}
public Long getLongId(){
return (Long)id;
}
}
然后你必须在你的一个实体上声明映射(无论在哪个实体上,它只需要声明 @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()
;
我在使用 getEvents
方法时遇到以下异常:
org.hibernate.MappingException: Unknown entity: 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
table将教师id与事件关联起来。我没有将此 table 映射到实体。我只想从中获取 ID。 PostgreSQL table 中的 ID 是 bigint
。
有什么方法可以在不单独 class 映射 TeacherEvents
实体的情况下实现它?
在 JPA 2.1 中有一个名为 "result set mapping" 的功能。
基本上你必须定义一个 POJO class 来保存结果值(所有值都必须使用构造函数传递):
public class IdResult{
private Object id;
public IdResult(Object id){
this.id = id;
}
public Long getLongId(){
return (Long)id;
}
}
然后你必须在你的一个实体上声明映射(无论在哪个实体上,它只需要声明 @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()
;