可以休眠将一个pojo数据转换为几乎没有字段的另一个pojo

时间:2019-02-23 16:28:42

标签: java hibernate nhibernate-mapping hibernate-criteria

我有两个实体:

POJO 1:

@Entity
@Table(name = "tasks")
Class Task{

    @Id
    @Column(name = "id")
    private String id ;

    private String claimedId;

    private String name ; 

    private Date date;
    // gets etc...

}

POJO 2:

@Entity
@Table(name = "calimtask")
Class ClaimTask{

    String id ; 

    String claimedId; 

    String name; 

    // gets etc... 
} 

POJO 2是使用POJO 1的某些字段创建的。 我们在数据库中有任务表的数据。

Hibernate是否有可能使用POJO 1获取id,claimedId和name的数据并转换为POJO 2?

1 个答案:

答案 0 :(得分:0)

您永远不要尝试将Entity类从一个实体转换为另一个实体,因为每个实体都代表一个表。

但是,Hibernate提供了一种从使用Hibernate POJO2类选择的列中返回Transformers作为对象的方法。在您的情况下,您将需要使用要返回的列的getter setter编写自定义POJO2。请注意,变量的名称必须与别名列完全一样。

public static List<ClaimTask> getDetailsfromTask(){
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction tx = null;
    List<ClaimTask> list =  new ArrayList<ClaimTask>();
    try {
        tx = session.beginTransaction();
        Criteria cr = session.createCriteria(Task.class);
        cr.setProjection(Projections.projectionList()
                .add......;//Pick all the columns you need from Task
        cr.setResultTransformer(Transformers.aliasToBean(ClaimTask.class));
        list = (List<ClaimTask>) cr.list();
   }catch (Exception asd) {
        System.out.println(asd.getMessage());
        if (tx != null) {
            tx.rollback();
        }
    } finally {
        session.close();
    }
     return list;
}

请注意,ClaimTask中的属性应与您从Task中提取的列别名相同。还要确保ClaimTask只是普通的getter setter类,而不是实体类。