Hibernate @Formula注释不起作用

时间:2016-02-26 09:51:31

标签: java sql oracle hibernate

我在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。

1 个答案:

答案 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 )"/>