Java 有没有办法在hibernate中将记录选择性地加载到惰性集合中?
我想知道是否有可能在hibernate中返回一个持久实体列表,并且只将选定的记录加载到该列表中每个实体的集合中。例如,我有一个大约5000个股票报价人的名单,每个人都有一系列的价格记录。所以我不想把所有的价格记录都加到每个股票上,也许只是最后的350左右。我不太确定如何做到这一点,但我所有的尝试都出现了ClassCastException或查询错误 以下是我的股票代码类别/配置:Java 有没有办法在hibernate中将记录选择性地加载到惰性集合中?,java,sql,hibernate,Java,Sql,Hibernate,我想知道是否有可能在hibernate中返回一个持久实体列表,并且只将选定的记录加载到该列表中每个实体的集合中。例如,我有一个大约5000个股票报价人的名单,每个人都有一系列的价格记录。所以我不想把所有的价格记录都加到每个股票上,也许只是最后的350左右。我不太确定如何做到这一点,但我所有的尝试都出现了ClassCastException或查询错误 以下是我的股票代码类别/配置: @Entity @Table(name="tickers", uniqueConstrain
@Entity
@Table(name="tickers",
uniqueConstraints =
@UniqueConstraint(columnNames={"symbol"}))
@SecondaryTable(name="groups")
public class Ticker implements Persistable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ticker_id", nullable=false, unique=true, length=11)
@Type(type="integer")
public int getTickerId() {
return this.tickerId;
}
public void setTickerId(int tickerId) {
this.tickerId = tickerId;
}
private int tickerId;
@Column(name="name", nullable=false, unique=false, length=60)
@Type(type="java.lang.String")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
@Column(name="symbol", nullable=false, unique=true, length=10)
@Type(type="java.lang.String")
@NaturalId
public String getSymbol() {
return symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
private String symbol;
@Column(name="type", nullable=false, unique=false, length=20)
@Enumerated(value=EnumType.STRING)
public TickerType getTickerType() {
return tickerType;
}
public void setTickerType(TickerType tickerType) {
this.tickerType = tickerType;
}
private TickerType tickerType;
@Column(name="supergroup", nullable=true, unique=false, length=100, table="groups")
@Enumerated(value=EnumType.STRING)
public TickerSuperGroup getTickerSuperGroup() {
return tickerSuperGroup;
}
public void setTickerSuperGroup(TickerSuperGroup tickerSuperGroup) {
this.tickerSuperGroup = tickerSuperGroup;
}
private TickerSuperGroup tickerSuperGroup;
@Column(name="industrygroup", nullable=true, unique=false, length=100, table="groups")
@Enumerated(value=EnumType.STRING)
public TickerGroup getTickerGroup() {
return tickerGroup;
}
public void setTickerGroup(TickerGroup tickerGroup) {
this.tickerGroup = tickerGroup;
}
private TickerGroup tickerGroup;
@Column(name="subgroup", nullable=true, unique=false, length=100, table="groups")
@Enumerated(value=EnumType.STRING)
public TickerSubGroup getTickerSubGroup() {
return tickerSubGroup;
}
public void setTickerSubGroup(TickerSubGroup tickerSubGroup) {
this.tickerSubGroup = tickerSubGroup;
}
private TickerSubGroup tickerSubGroup;
@OneToMany(mappedBy="ticker", targetEntity=com.lisria.model.historical.PriceRecord.class,
cascade=CascadeType.ALL, orphanRemoval=true, fetch=FetchType.LAZY)
@OrderBy("trade_date")
private List<PriceRecord> getPriceRecords() {
return priceRecords;
}
@SuppressWarnings("unused")
private void setPriceRecords(List<PriceRecord> priceRecords) {
this.priceRecords = priceRecords;
}
private List<PriceRecord> priceRecords = new ArrayList<PriceRecord>();
但这会导致LazyInitialization错误,而将FetchType更改为eager,甚至初始化集合都会导致加载整个集合,这正是我想要避免的。那么,我应该如何着手解决这个问题呢?即使我不能得到一个要迭代的ticker列表,我也可以得到一个主键列表,用它来加载表中的每个ticker,但仍然不知道如何只加载PriceRecords的一个子集。所以这里有一个答案:
虽然这在搜索引擎中很难找到,而且它将我的类与hibernate实现结合在一起,但我现在还是要接受它。还有其他答案让我感兴趣
@Override
public List<Ticker> getListOfTickers(Date startDate) {
Session session = sessionFactory.openSession();
session.beginTransaction();
@SuppressWarnings("unchecked")
List<Ticker> tickers =
session.createQuery("from Ticker as tickers "
+ "left join tickers.priceRecords as prices "
+ "with prices.tradeDate >=" + startDate.toString()).list();
session.getTransaction().commit();
session.close();
return tickers;
}
session.createQuery("from Ticker").list()