0

我有一个实体来映射系统上的历史数据。

@Entity
@Table(name = "historicsview")
@XmlRootElement
public class ElementsHistorical implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "historicalid")
    private Long historicalId;

    @Basic(optional = false)
    @Column(name = "historicdate")
    private Date historicDate;

    @Basic(optional = false)
    @Column(name = "value")
    private double value;

    @Basic(optional = false)
    @Column(name = "code")
    private int code;

    @Basic(optional = false)
    @Column(name = "subtype")
    private int subType;

    @Basic(optional = false)
    @Column(name = "subcode")
    private int subCode;        

    @Basic(optional = false)
    @Column(name = "uniquecode", unique=true)
    private String uniqueCode;

    @JoinColumn(name = "elementid", referencedColumnName = "elementid")
    @ManyToOne(optional = false)
    private Elements element;
    .
    .
    .
}

为了避免巨大的历史表,数据库中有一个触发器用于根据历史日期实现表分区,因此每个月都有一个表的副本。当我需要获取数据时,我需要根据提供的日期加入表,因此系统会创建这样的查询:

select * from 
(select * from elementshistorical_201905 
where historicdate >= TO_TIMESTAMP('20190502 00:00:00', 'yyyyMMdd hh24:mi:ss') 
union 
select * from demeter.elementshistorical_201906 where historicdate <= TO_TIMESTAMP('20190606 23:59:59', 'yyyyMMdd hh24:mi:ss')) 
as foo where ((subcode=2 and (subtype=2 or subtype=8)) or code=100) and elementid in (16290) 
order by historicdate asc

createNativeQuery用来获取此查询的结果,如下所示:

public List<ElementsHistorical> executeSqlQueryHistory(String query) {
    Session session = null;
    List<ElementsHistorical> result;
    try { 
        session = SessionUtil.getSession();
        result = session.createNativeQuery(query).addEntity(ElementsHistorical.class).getResultList();
        return result;
    }catch(Exception e) {
        e.printStackTrace();
        return null;
    }finally {
        session.clear();
        session.close();            
    }

}

问题是它并不总是显示与我在数据库中执行查询时得到的完全相同的结果,相反,有时结果显示一些重复的寄存器而不是原始寄存器。但是,两种情况下寄存器的数量是相同的。对于我所做的测试,似乎在返回的寄存器数量超过 4200 个时开始发生这种情况,因此这可能是内存管理问题。请注意,对于每一个ElementsHistorical,我也需要相关的Element。如果我不将实体添加到查询中并将结果视为 a List<Object[]>,则结果很好并且不会显示这个“损坏”的寄存器,但我不能使用这种方法,因为那样我需要得到每个Element分别来自每个ElementsHistorical,这在性能方面会很糟糕。

有人认为这也可能是内存管理问题吗?我怎么能解决这个问题?

4

0 回答 0