我正在创建一个包含多个表的复杂查询,需要列出结果.通常,我正在使用EntityManager并将结果映射到JPA-Representation:
UserEntity user = em.find(UserEntity.class, "5");
Run Code Online (Sandbox Code Playgroud)
然后我可以在用户UserEntity类定义它时访问所有值.但是,如何访问本机多表查询返回的字段值?我得到的是一个对象列表.到目前为止这很好,但对象是什么"是"?阵列?地图?采集?...
//simpleExample
Query query = em.createNativeQuery("SELECT u.name,s.something FROM user u, someTable s WHERE s.user_id = u.id");
List list = query.getResultList();
//do sth. with the list, for example access "something" for every result row.
Run Code Online (Sandbox Code Playgroud)
我想答案很简单,但是大多数示例只显示直接转换为targetClass时的用法.
PS:在示例中,我当然可以使用类映射.但在我的情况下someTable不是由JPA管理,因此我没有实体,也没有它的类表示,因为我加入了20个表,我不想创建所有的类只是为了访问这些值.
有人可以告诉我JPA 1.0 EntityManager在通过find检索对象时的内在原因,如果找不到则必须处理null,但是当通过createQuery使用Query接口时getResultList会在找不到时抛出NoResultException.
也许我错过了一些东西,但我觉得它与语言非常不一致,实际上我不得不做很多的重新设计,因为使用查询界面从简单的查找器更改为更细粒度的查询.
多谢你们.
我尝试Select * from LogEntry用Hibernate 做一些事情.插入工作正常:
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
[...]
protected EntityManager manager;
protected final String tableName = "LogEntry";
public DatabaseImpl(DB_TYPE db) {
this.db = db;
if (entityManagerFactory != null && entityManagerFactory.isOpen()) {
entityManagerFactory.close();
}
entityManagerFactory = Persistence.createEntityManagerFactory(db.getPersUnit());
manager = entityManagerFactory.createEntityManager();
}
public void insert(LogEntry entry) {
manager.getTransaction().begin();
manager.persist(entry);
manager.getTransaction().commit();
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用此方法获取插入的值时:public LogEntryList getAll(){
manager.getTransaction().begin();
Query query = manager.createNativeQuery("SELECT * FROM " + tableName + ";");
ArrayList<LogEntry> entries = (ArrayList<LogEntry>) query.getResultList();
manager.getTransaction().commit();
return new LogEntryList(entries);
} …Run Code Online (Sandbox Code Playgroud)