使用该getEvents方法时,出现以下异常:
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实体?
teachers_event
bigint
TeacherEvents
在JPA 2.1中,有一个称为“结果集映射”的功能。
基本上,您必须定义一个POJO类,该类将保存结果值(所有值必须使用构造函数传递):
public class IdResult{ private Object id; public IdResult(Object id){ this.id = id; } public Long getLongId(){ return (Long)id; } }
然后,您必须在您的一个实体上声明映射(无论在哪个实体上,它都必须是declated @Entity):
@Entity
@SqlResultSetMapping(name="IdMapping", classes = { @ConstructorResult(targetClass = IdResult.class, columns = {@ColumnResult(name="id")}) })
您必须在查询中使用别名以匹配@ColumnResult名称:
@ColumnResult
select te.event_id as id ...
最后在查询创建中使用:
Query query = entityManager.createNativeQuery(q, IdMapping.class); return (List<IdResult>) query.getResultList();
然后,您将在服务层中使用getLongId();
getLongId()