动态添加列,然后在hql中转换它

时间:2013-08-05 03:44:37

标签: hibernate hql

我有一个由以下字段组成的pojo

public class tooks 
{

    private String bbb;
    private DateTime ccc;
    private String ddd;
    private boolean eee = true;

    }

现在我有以下sql ..

    SELECT distinct u.bbb, 'Not Defined' Access_Type, u.ccc, u.ddd 
        FROM IOA_tooks u where u.eee='N' order by u.aaa

现在您可以看到在查询本身中创建了Access_Type列,并且上面的pojo中没有属性。请建议如何将此sql转换为hql以及需要在pojo中进行哪些更改

1 个答案:

答案 0 :(得分:0)

这样的事情(注意,如果你想将“Y”/“N”映射到布尔类型,你必须创建一个自定义数据类型;这个例子将坚持一个字符串):

public class tooks {
    private String bbb;
    private DateTime ccc;
    private transient String accessType = "Not Defined";
    private String ddd;
    private String eee = "Y";
}

我无法确切地说出你的目的,你没有提供任何其他信息,所以我只能假设你总是希望accessType为“Not Defined”。它不是数据库中的实际列,因此逻辑上不映射到对象中的任何字段。因此,只需在映射文件/注释中映射bbb,ccc,ddd和eee,并且不要将accessType映射为与数据库无关的。

Hibernate将忽略字段映射中的瞬态字段。如果您正在使用方法映射(getters / setters),则应使用JPA的@Transient注释标记getAccessType和setAccessType,Hibernate将忽略它们。

然后HQL与SQL几乎完全相同:

List<took> tooks = (List<took>)session.createQuery("select distinct t from took t where t.eee = 'N' order by t.aaa asc").list();

结果中的每个对象都有accessType ==“Not Defined”,但请注意,这不是因为它是从数据库中选择的(因为它没有被映射),它只是在Java对象中初始化的值,这似乎是成为你想要的最终结果。