我有一个实体,可以在系统上映射历史数据。
@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
。
如果我不将实体添加到查询中,并且将结果视为List<Object[]>
,则结果很好并且不会显示此“损坏的”寄存器,但是我不能使用这种方法,因为那样我将需要分别从每个Element
获取每个ElementsHistorical
,这在性能方面将是可怕的。
有人认为这也可能是内存管理问题吗?我该怎么解决?