Java 有没有办法在hibernate中将记录选择性地加载到惰性集合中?

Java 有没有办法在hibernate中将记录选择性地加载到惰性集合中?,java,sql,hibernate,Java,Sql,Hibernate,我想知道是否有可能在hibernate中返回一个持久实体列表,并且只将选定的记录加载到该列表中每个实体的集合中。例如,我有一个大约5000个股票报价人的名单,每个人都有一系列的价格记录。所以我不想把所有的价格记录都加到每个股票上,也许只是最后的350左右。我不太确定如何做到这一点,但我所有的尝试都出现了ClassCastException或查询错误 以下是我的股票代码类别/配置: @Entity @Table(name="tickers", uniqueConstrain

我想知道是否有可能在hibernate中返回一个持久实体列表,并且只将选定的记录加载到该列表中每个实体的集合中。例如,我有一个大约5000个股票报价人的名单,每个人都有一系列的价格记录。所以我不想把所有的价格记录都加到每个股票上,也许只是最后的350左右。我不太确定如何做到这一点,但我所有的尝试都出现了ClassCastException或查询错误

以下是我的股票代码类别/配置:

@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()