我在Hibernate 4.3.7中使用@Formula注释,但它没有加载值。
@Entity
@AccessType(Type.PROPERTY)
@Table(name = "ENTITY_B_TABLE")
public class EntityB extends AbstractEntity {
//
// ...
//
private EntityB parentEntityB;
@Formula(value = "SELECT * FROM ENTITY_B_TABLE WHERE TYPE IN ('A', 'B', 'C') AND ROWNUM=1 CONNECT BY PRIOR PARENT_ID = ID START WITH ID = :id")
public EntityB getParentEntityB() {
return parentEntityB;
}
public void setParentEntityB(EntityB parentEntityB) {
this.parentEntityB = parentEntityB;
}
}
在这种情况下,我有一个错误:
引起:org.hibernate.MappingException:无法确定:my.package.EntityB的类型, 在表:ENTITY_B_TABLE,对于列:[org.hibernate.mapping.Formula( SELECT * FROM ENTITY_B_TABLE LEVEEL_NAME IN(' A',' B',' C')和 ROWNUM = 1通过PRENT PARENT_ID = ID ID =:id)]
连接
在SQL" id"是当前EntityB的id。 如果我向getParentEntityB方法添加@Transient注释,则没有错误,但parentEntityB为null。 ENTITY_B_TABLE中没有parentEntityB列,我们也不想创建它,我们希望动态加载它。我们可以保证,根据select,parentEntityB并非总是为空。
有没有更好的方法来解决这个问题? (我也试过@Loader没有成功)
尝试在场上移动@Formula。在我之前的经历中,我看到了一个>很多人只是在田野上。
结果是一样的。
我发现了一些像这样的东西:forum.hibernate.org/viewtopic.php?f = 1& t = 956537 - 也许这有帮助吗? 简而言之 - 可能需要@OneToOne。
使用(@OneToOne或@ManyToOne)并且没有@Transient没有异常,但parentEntityB仍然等于null。
答案 0 :(得分:0)
我怀疑是否可以使用公式返回实际对象。 从文档看起来它只返回原始只读值
@Formula("obj_length * obj_height * obj_width")
public long getObjectVolume()
又一个例子,但又只返回一个原始值。
<property name="totalPrice"
formula="( SELECT SUM (li.quantity*p.price) FROM LineItem li, Product p
WHERE li.productId = p.productId
AND li.customerId = customerId
AND li.orderNumber = orderNumber )"/>