我对hibernate相当新,我遇到了一个问题,我试图通过非常基本的代码来克服这个问题,只是为了让它达到工作的程度。这就是我所拥有的:
@Entity
@Table(name="budgetfunds")
public class BudgetItem implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="budgetFundsID")
private int budgetFundID;
@Column(name="budgetYear")
private int budgetYear;
@ManyToOne
@JoinColumn(name = "semesterID")
private Semester semester;
@ManyToOne
@JoinColumn(name = "fundCategoryID")
private FundCategory fundCategory;
@OneToMany
@JoinColumns({
@JoinColumn(name = "fundCategoryID", referencedColumnName = "fundCategoryID"),
@JoinColumn(name = "semesterID", referencedColumnName = "semesterID"),
@JoinColumn(name = "year", referencedColumnName = "budgetYear")
})
private Set<Fund> fundItems;
@Column(name="budgetID")
private int budgetID;
@Column(name="budgetFundAmount")
private BigDecimal fundAmount;
@Formula(value = "select sum(f.fundAmount) from Fund f where f.fundCategoryID = fundCategoryID and f.semesterID = semesterID and f.year = budgetYear")
private BigDecimal requestedAmount;
...
}
这是我的问题。我有一组fundItems,我需要求和并设置为此对象的属性,以便它可以在jsp中引用。最后一个属性是我尝试这样做...唯一的问题是,它不是有效的sql,因为它不知道semesterID,budgetYear和fundCategoryID值的来源。有没有办法修复此查询以每个对象?
此外,如果没有完全重构代码/数据库有更简单的方法,请告诉我。
答案 0 :(得分:2)
在搜索了整个地方之后,我终于找到了某人关于使用“派生属性”进行休眠的教程 这是来源:
http://blog.eyallupu.com/2009/07/hibernate-derived-properties.html
以下是我的问题的具体解决方案:
@Formula(value = "(select sum(f.fundAmount) from Fund f " +
"where f.fundCategoryID = fundCategoryID " +
"and f.semesterID = semesterID "+
"and f.year = budgetYear)")
private BigDecimal requestedAmount;
为了解释这是如何工作的,我将引用上面链接中的一节:
...通过不在列上声明别名(此处为[fundCategoryID,semesterID和budgetYear]列),我可以引用 拥有实体 列 - 当我的公式需要获取关联实体时,通常需要这样做......