0

Hibernate4.1 エンティティ クラスの 1 つで @Formula アノテーションを使用しようとしていました。いくつかの記事から、この注釈をプロパティ定義に配置する必要があることを知り、そうしました。しかし、何も起こりませんでした。式の内容がどれほど単純であっても、Hibernate はプロパティを生成された sql に直接配置し続け、「無効な識別子」例外をスローしました。これは、物理テーブルにその名前に対応する列が明らかに存在しなかったためです。

@Formula の使用方法について見つけたドキュメントはわずかしかありませんが、Hibernate4 でまだサポートされているかどうかについては言及していません。では、この質問には特定の答えがありますか? そして、この注釈を何らかの方法で使用することは可能ですか?

追加内容: サンプルコードは次のとおりです。

package sample.model;

import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Formula;


@Entity
@Table(name = "STAGE_TRACK", schema = "")
public class StageTrack implements java.io.Serializable {

    // Fields

    private BigDecimal id;
    private Date startTime;
    private Date endTime;

    @Formula("(END_TIME - START_TIME)*24*60")
    private BigDecimal duration;
    public BigDecimal getDuration() {
        return this.duration;

    }
    public void setDuration(BigDecimal duration) {
        this.duration = duration;
    }

    // Constructors
    /** default constructor */
    public StageTrack() {
    }

    /** minimal constructor */
    public StageTrack(BigDecimal id) {
        this.id = id;
    }

    /** full constructor */
    public StageTrack(BigDecimal id, Date startTime, Date endTime) {
        this.id = id;
        this.startTime = startTime;
        this.endTime = endTime;
    }

    // Property accessors
    @Id
    @Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0)
    public BigDecimal getId() {
        return this.id;
    }

    public void setId(BigDecimal id) {
        this.id = id;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "START_TIME", length = 7)
    public Date getStartTime() {
        return this.startTime;
    }

    public void setStartTime(Date startTime) {
        this.startTime = startTime;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "END_TIME", length = 7)
    public Date getEndTime() {
        return this.endTime;
    }

    public void setEndTime(Date endTime) {
        this.endTime = endTime;
    }

}
4

1 に答える 1

0

問題は@Formula、フィールドに配置する一方で、他の注釈はゲッターに配置されるため、@Formula無視されることです。

1つの戦略を選択し、それを一貫して適用する必要があります(明示的にオーバーライドしない限り@AccessType)。

@Formula("(END_TIME - START_TIME)*24*60")
public BigDecimal getDuration() {
    return this.duration;

}
于 2013-01-21T15:40:47.823 に答える