坚持使用@Transient

时间:2015-04-07 11:44:02

标签: java jpa persistence eclipselink

在我的POJO中我有这个:

@Transient
private int qtyMentee;

在我的DAO中我有这个问题:

public List<Employee> findQtyMentee(){
    TypedQuery<Employee> query = (TypedQuery<Employee>) em.createNativeQuery(
        "select *, count(mentor_id) as qtymentee from employee group by id order by qtymentee asc" , Employee.class);
    Collection<Employee> employee  = (Collection<Employee>) query.getResultList();
    return (List<Employee>) employee;
}

当我试图让Qtymentee永远返回0.

注释@Transient在这种情况下是错误的吗?

如何获取此值并在我的应用程序中显示?

OBS:我正在使用Eclipselink。

感谢。

3 个答案:

答案 0 :(得分:2)

标有@Transient的字段不会被保留。这意味着它们的值不存在于数据库中,并且在查询中使用它们将不起作用。来自规范:

  

此注释指定属性或字段不是   持久性。

Javadoc link

答案 1 :(得分:0)

@Transient基本上意味着do not serialize me。因此@Transient会阻止您的字段被保留。你应该删除它。

答案 2 :(得分:0)

不支持您尝试做的事情。瞬态意味着它不是由JPA以任何方式映射或处理的字段 - 它被排除在数据库之外被读取或持久化。在这种情况下,您试图将计算数据推送到实体字段,这将破坏由上下文维护的实体的缓存。

希望您已将此映射为对象模型中的1:M(Say employee.mentees)和M:1(比如employee.mentor)。如果是这样,集合映射上的简单大小将返回&#34; mentee&#34; s的数量,而不需要在某处存储值。

如果您希望使用JPQL(而不是带有createNativeQuery方法的SQL)直接返回值排序的列表:

List<Object[]> list = createQuery("Select e, size(e.mentees) as qtymentee from Employee e order by qtymentee asc").getResultList();

如果您还没有使用引用映射映射mentor_id字段,则需要使用子查询,因为我不相信您发布的SQL查询会起作用。

如果必须将其放入数据对象,可以使用此处描述的构造函数表达式http://docs.oracle.com/cd/E15523_01/apirefs.1111/e13946/ejb3_langref.html#ejb3_langref_constructor

看起来像是:

  createQuery("select new DAO(e.id, e.otherfield .., size(e.mentees)) from Employee e")