java - 函数结果 AS 类字段值

标签 java hibernate postgresql

我有 PostgreSQL 数据库,其中有一个函数 month_traffic()

CREATE FUNCTION month_traffic(hostcode int) RETURNS numeric(14,2) AS $$
DECLARE
start_date date := CAST((EXTRACT(year FROM now()) || '-' || EXTRACT(month FROM now()) || '-' || '01') AS date);
end_date date := CAST((EXTRACT(year FROM now()) || '-' || EXTRACT(month FROM now()) + 1 || '-' || '01') AS date); 
BEGIN
RETURN (SELECT SUM(day_mbytes) FROM daily WHERE (day_hstcode = hostcode) AND (day_date >= start_date) AND (day_date < end_date));
END;
$$ LANGUAGE plpgsql;

我还有Host

package ru.gooamoko.model;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Formula;

@Entity
@Table(name="hosts")
public class Host implements Serializable {

    @Id
    @Column(name="hst_pcode")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @ManyToOne
    @JoinColumn(name="hst_grpcode", insertable=false, updatable=false)
    private Department group;

    @Column(name="hst_description", length=50, nullable=false)
    private String description;

    @Column(name="hst_net", nullable=false)
    private short net;

    @Column(name="hst_addr", nullable=false)
    private short addr;

    @Column(name="hst_ballance", nullable=false, columnDefinition="numeric(11,2) NOT NULL DEFAULT 0")
    private float ballance;

    @Column(name="hst_price", nullable=false, columnDefinition="numeric(5,2) NOT NULL DEFAULT 0")
    private float price;

    @Column(name="hst_enabled", nullable=false, columnDefinition="boolean NOT NULL DEFAULT false")
    private boolean enabled;

    @Column(name="hst_still", nullable=false, columnDefinition="boolean NOT NULL DEFAULT false")
    private boolean steel;

  // daily traffic
  private transient float dayKBytes = 0;
  // monthly traffic
  private transient float monthMBytes = 0;
  // Setters and getters
  // . . .
}

是否可以将 postgresql 函数的结果设置为像 monthMBytes 这样的字段值

// month traffic
@Formula("(select month_traffic(hst_pcode)")
private transient float monthMBytes = 0;

最好的问候。

最佳答案

我阅读了相关的 SO 问题、一些文档和...

  1. 我需要使字段成为非 transient 的。
  2. 我不需要外勤人员。 setter/getter 就足够了。
  3. 在 @Formula 注释中,我编写了从函数中选择值的 sql 查询。
  4. PostgreSQL 函数必须返回NOT NULL值。

所以,我的新功能是

CREATE OR REPLACE FUNCTION month_traffic(hostcode int) RETURNS numeric(14,2) AS $$
DECLARE
  begin_date date := CAST((EXTRACT(year FROM now()) || '-' || EXTRACT(month FROM now()) || '-' || '01') AS date);
  end_date date := CAST((EXTRACT(year FROM now()) || '-' || EXTRACT(month FROM now()) + 1 || '-' || '01') AS date);
  result numeric(14,2) := 0;
BEGIN
  result := (SELECT SUM(day_mbytes) FROM daily 
    WHERE (day_hstcode = hostcode) AND (day_date >= begin_date) AND (day_date < end_date));
  IF (result IS NULL) THEN
    result := 0;
  END IF;
  RETURN result;
END;
$$ LANGUAGE plpgsql

我的注释字段是

  . . .
  @Formula("(select month_traffic(hst_pcode))")
  private float monthMBytes;

  public float getMonthMBytes() {
    return monthMBytes;
  }
  . . .

现在一切正常。感谢您的链接和评论。

关于java - 函数结果 AS 类字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25617517/

相关文章:

java - 如何将日期从 mm/dd/yyyy 转换为 mm dd, yyyy

java - 为什么我的 jsp 文件在 Tomcat 部署到 war 文件时不显示?

java - 使用提供的 ID 使用 Hibernate 保存新对象

java - JPA/Hibernate 实体类和同步的最佳实践是什么?

java - JFace 对话框单元编辑器 : how to make buttons always appear?

java - CardView 无法正常工作

java - Hibernate与JPA注释问题-惰性对象

java - 如何使用spring批处理在postgresql中执行存储过程?

sql - 我想了解每台机器每天的工作时间的开始和结束时间

ruby-on-rails - PGError : ERROR: source database "template1" is being accessed by other users