书中的用例;Java持久化与Hibernate,第二版“;

书中的用例;Java持久化与Hibernate,第二版“;,hibernate,hql,Hibernate,Hql,我正在读《Java持久化与Hibernate,第二版》。它举了一个向ebay这样的竞标者出售物品的例子。在第400页,作者说 查询select i from item i left join fetch i.bids b其中b.amount>20无效。您不能说“加载项目实例并初始化其bids集合,但只能使用具有一定数量的Bid实例。” 我不太明白。在我看来,这是有效的,但它将只呈现的项目有一个出价金额大于20。在这种情况下,它将呈现具有该条件的内部联接 此外,以下请求是否有效?select i

我正在读《Java持久化与Hibernate,第二版》。它举了一个向ebay这样的竞标者出售物品的例子。在第400页,作者说

查询
select i from item i left join fetch i.bids b其中b.amount>20
无效。您不能说“加载项目实例并初始化其bids集合,但只能使用具有一定数量的Bid实例。”

我不太明白。在我看来,这是有效的,但它将只呈现的项目有一个出价金额大于20。在这种情况下,它将呈现具有该条件的内部联接


此外,以下请求是否有效?

select i from item i left join fetch i.bids b on b.amount>20
有效?

select i from item i left join fetch i.bids b其中b.amount>20
作为HQL无效。由于HQL结果用于返回项目对象,因此您不能告诉hibernate请创建
项目
对象,但在创建对象时,不要使用所有
投标
填充,而只使用金额大于20的
投标
填充

考虑下面的类

public class Item {
    String name;
    Collection<Bid> bids;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Collection<Bid> getBids() {
        return bids;
    }

    public void setBids(Collection<Bid> bids) {
        this.bids = bids;
    }
}
公共类项目{
字符串名;
收集投标书;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公开募捐{
退还投标书;
}
公共招标(集合投标){
此参数为:投标=投标;
}
}
Update:(让我们运行一个示例,看看如果hibernate允许此查询,会发生什么情况)

如果hibernate允许它发生,主要问题是:

  • 第一个问题这在概念上是错误的,因为任何使用从repo返回的item1java对象的服务都不知道item.getBids只包含amount>20的bid
  • Hibernate只保留一个对象引用来表示会话中的数据库实体(可重复读取保证、脏检查等)。因此,如果您执行另一个
    操作,从i.itemId=1的项目i中选择i,hibernate就会出现问题,因为现在它必须有两个java对象来表示该会话中的项目1(一个出价大于20,另一个出价大于项目1的所有出价)

  • 希望这能清楚地解释为什么查询不能被允许

    从项目i中选择i左加入fetch i.bids b其中b.amount>20
    ,因为HQL无效。由于HQL结果用于返回项目对象,因此您不能告诉hibernate请创建
    项目
    对象,但在创建对象时,不要使用所有
    投标
    填充,而只使用金额大于20的
    投标
    填充

    考虑下面的类

    public class Item {
        String name;
        Collection<Bid> bids;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Collection<Bid> getBids() {
            return bids;
        }
    
        public void setBids(Collection<Bid> bids) {
            this.bids = bids;
        }
    }
    
    公共类项目{
    字符串名;
    收集投标书;
    公共字符串getName(){
    返回名称;
    }
    公共void集合名(字符串名){
    this.name=名称;
    }
    公开募捐{
    退还投标书;
    }
    公共招标(集合投标){
    此参数为:投标=投标;
    }
    }
    
    Update:(让我们运行一个示例,看看如果hibernate允许此查询,会发生什么情况)

    如果hibernate允许它发生,主要问题是:

  • 第一个问题这在概念上是错误的,因为任何使用从repo返回的item1java对象的服务都不知道item.getBids只包含amount>20的bid
  • Hibernate只保留一个对象引用来表示会话中的数据库实体(可重复读取保证、脏检查等)。因此,如果您执行另一个
    操作,从i.itemId=1的项目i中选择i,hibernate就会出现问题,因为现在它必须有两个java对象来表示该会话中的项目1(一个出价大于20,另一个出价大于项目1的所有出价)

  • 希望这能清楚地解释为什么不允许查询

    这个例子是关于HQL(Hibernate的查询语言)而不是SQL本身的,对吗?是的,它是关于HQL的例子是关于HQL(Hibernate的查询语言)而不是SQL本身的,对吗?是的,它是关于HQL谢谢你的回答谢谢你的回答