使用 Hibernate 加入 @Formula

Posted

技术标签:

【中文标题】使用 Hibernate 加入 @Formula【英文标题】:Join in @Formula with Hibernate 【发布时间】:2017-02-05 14:44:39 【问题描述】:

当我加载实体时,我将使用@Formula 注释来使用聚合函数。

如果我使用下面的语句,我会得到一个异常。

(SELECT sum(inovalue.vba) FROM INO i_no INNER JOIN i_no.listValues inovalue WHERE i_no.id = '91c78419-e528-453f-a60d-9f2050e12c79') 原因:java.sql.SQLSyntaxErrorException:语法错误:在第 1 行第 401 列遇到“WHERE”。 在 org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(未知来源) 在 org.apache.derby.client.am.SqlException.getSQLException(未知来源) 在 org.apache.derby.client.am.Connection.prepareStatement(未知来源) 在 com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:213) 在 org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534) 在 org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:452) 在 org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161) 在 org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1700) 在 org.hibernate.loader.Loader.doQuery(Loader.java:801) 在 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) 在 org.hibernate.loader.Loader.loadCollection(Loader.java:2166) ... 17 更多 原因:org.apache.derby.client.am.SqlException:语法错误:在第 1 行第 401 列遇到“WHERE”。 在 org.apache.derby.client.am.Statement.completeSqlca(未知来源) 在 org.apache.derby.client.net.NetStatementReply.parsePrepareError(未知来源) 在 org.apache.derby.client.net.NetStatementReply.parsePRPSQLSTTreply(未知来源) 在 org.apache.derby.client.net.NetStatementReply.readPrepareDescribeOutput(未知来源) 在 org.apache.derby.client.net.StatementReply.readPrepareDescribeOutput(未知来源) 在 org.apache.derby.client.net.NetStatement.readPrepareDescribeOutput_(未知来源) 在 org.apache.derby.client.am.Statement.readPrepareDescribeOutput(未知来源) 在 org.apache.derby.client.am.PreparedStatement.readPrepareDescribeInputOutput(未知来源) 在 org.apache.derby.client.am.PreparedStatement.flowPrepareDescribeInputOutput(未知来源) 在 org.apache.derby.client.am.PreparedStatement.prepare(未知来源) 在 org.apache.derby.client.am.Connection.prepareStatementX(未知来源) ... 26 更多

如果我在 @Formular 注释之外使用语句,我会得到正确的结果。我不得不说我在另一个对象中使用了这个注解,而不是在 INO 对象中。

这些是简化形式的实体。

实体 Cs

@Entity
@Table(name = "cs")
public class Cs  

    @Id
    @GeneratedValue(generator="uuid")
    @GenericGenerator(name="uuid", strategy="org.hibernate.id.UUIDGenerator")
    @Column(length=40)
    private String id = "";

    @Column(name = "inoId_ref_id", length = 40)
    private String inoId = null;

    @Formula("(SELECT sum(inovalue.vba) FROM Ino i_no INNER JOIN i_no.listValues inovalue WHERE i_no.id = inoId)")
    private Double lbst = null;

    public Cs() 
    

实体 Ino

@Entity 
@FilterDef(name="inoDateFilter", parameters=@ParamDef( name="inoDateFilterParam", type="integer" ) )
@Table(name="ino")
public class Ino 

    @Id
    @GeneratedValue(generator="uuid")
    @GenericGenerator(name="uuid", strategy="org.hibernate.id.UUIDGenerator")
    @Column(length=40)
    private String id = "";

    @OneToMany (orphanRemoval=true, cascade=CascadeType.ALL)
    @LazyCollection(value=LazyCollectionOption.FALSE)
    @JoinColumn(name = "ioifeflref_id")
    @Filter(name = "inoDateFilter", condition="year(datumVon) = :inoDateFilterParam")
    @OrderBy("datumVon ASC")
    private List<InoValue> listIntervallFeFl = new ArrayList<InoValue>();

    public INO() 
    

实体 InoValue

@Entity 
@Table(name="inovalue")
public class InoValue  

    @Id
    @GeneratedValue(generator="uuid")
    @GenericGenerator(name="uuid", strategy="org.hibernate.id.UUIDGenerator")
    @Column(length=40)
    private String id = "";

    @Column(name = "vba")
    private Double vba = null;

     */
    public InoValue() 
    

怎么了?我使用 derby 数据库进行测试。

有人知道吗?

问候 MS-技术

【问题讨论】:

【参考方案1】:

确保 @Formula 注释的内容是有效的 SQL,而不是 HQL/JPQL。

【讨论】:

以上是关于使用 Hibernate 加入 @Formula的主要内容,如果未能解决你的问题,请参考以下文章

使用 Hibernate 加入 @Formula

如何在 Hibernate 中左加入获取多个孩子?

spring整合hibernate

直接加入 JPA 或 HIBERNATE

Hibernate - 有没有办法加入 2 列反对 1?

Hibernate @OneToOne 映射不加入列?