formula 返回list_如何在Hibernate / JPA中使用@Formula

我试图看看@Formula注释如何使用下面的一段简单代码.

我能够打印出description和bidAmount列的值,但是使用@Formula注释的字段,即shortDescription和averageBidAmount返回null.

任何人都可以帮助指出这里的代码有什么问题吗?

我在Mac OSX上使用Hibernate 5.0,postgresql-9.3-1102-jdbc41和TestNG.

import java.math.BigDecimal;

import java.util.List;

import javax.persistence.Entity;

import javax.persistence.EntityManager;

import javax.persistence.EntityManagerFactory;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.Persistence;

import javax.transaction.UserTransaction;

import org.testng.annotations.Test;

import com.my.hibernate.env.TransactionManagerTest;

public class DerivedPropertyDemo extends TransactionManagerTest {

@Test

public void storeLoadMessage() throws Exception {

EntityManagerFactory emf = Persistence.createEntityManagerFactory("HelloWorldPU");

try {

{

UserTransaction tx = TM.getUserTransaction();

tx.begin();

EntityManager em = emf.createEntityManager();

DerivedProperty derivedProperty1 = new DerivedProperty();

derivedProperty1.description = "Description is freaking good!!!";

derivedProperty1.bidAmount = BigDecimal.valueOf(100D);

DerivedProperty derivedProperty2 = new DerivedProperty();

derivedProperty2.description = "Description is freaking bad!!!";

derivedProperty2.bidAmount = BigDecimal.valueOf(200D);

DerivedProperty derivedProperty3 = new DerivedProperty();

derivedProperty3.description = "Description is freaking neutral!!!";

derivedProperty3.bidAmount = BigDecimal.valueOf(300D);

em.persist(derivedProperty1);

em.persist(derivedProperty2);

em.persist(derivedProperty3);

tx.commit();

for (DerivedProperty dp : getDerivedProperty(em)) {

System.out.println("============================");

System.out.println(dp.description);

System.out.println(dp.bidAmount);

System.out.println(dp.getShortDescription());

System.out.println(dp.getAverageBidAmount());

System.out.println("#############################");

}

em.close();

}

} finally {

TM.rollback();

emf.close();

}

}

public List getDerivedProperty(EntityManager em) {

List resultList = em.createQuery("from " + DerivedProperty.class.getSimpleName()).getResultList();

return resultList;

}

}

我的实体类是:

@Entity

class DerivedProperty {

@Id

@GeneratedValue

protected Long id;

protected String description;

protected BigDecimal bidAmount;

@org.hibernate.annotations.Formula("substr(description, 1, 12)")

protected String shortDescription;

@org.hibernate.annotations.Formula("(select avg(b.bidAmount) from DerivedProperty b where b.bidAmount = 200)")

protected BigDecimal averageBidAmount;

public String getShortDescription() {

return shortDescription;

}

public BigDecimal getAverageBidAmount() {

return averageBidAmount;

}

}

编辑

我正在阅读Java Persistence with Hibernate 2nd Ed.

upfG2.png

谢谢

最佳答案 您的DerivedProperty实例从持久性上下文返回(仅从查询返回的结果集中使用它们的ID).这就是为什么没有评估公式.

如果不关闭实体管理器,则不会清除持久性上下文.在提交第一个事务以强制清除持久性上下文后,尝试添加em.clear().

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值