当前位置: 首页 > 面试题库 >

休眠条件返回具有一对一子记录的父记录不为null?

余善
2023-03-14
问题内容

我有这样的一对一关系

父母

@JsonAutoDetect
@Entity
@Table(name = "Parent")
public class Parent{

    private Integer id;
    private Child child;

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column (name="idparent")
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "parent")
    @JoinColumn(name="idchild", nullable=true)
    public Child getChild() {
        return child;
    }
    public void setChild(Child child) {
        child.setParent(this);
        this.child = child;
    }
}

和孩子

@JsonAutoDetect
@Entity
@Table(name="Child")
public class Child{

    private Integer id;
    private Parent parent;

    @Id
    @GeneratedValue(generator = "foreign")
    @GenericGenerator(name = "foreign", strategy = "foreign", parameters = { @Parameter(name = "property", value = "parent") })
    @Column (name = "idchild")
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

    @OneToOne(fetch = FetchType.LAZY, optional = true)
    @Cascade({ org.hibernate.annotations.CascadeType.SAVE_UPDATE })
    @PrimaryKeyJoinColumn
    @JsonIgnore
    public Parent getParent() {
        return parent;
    }
    public void setParent(Parent parent) {
        this.parent= parent;
    }

}

我想创建返回具有孩子isNotNull的父母的条件,我尝试过像

Criteria criteria = session.createCriteria(Parent.class);
criteria.add(Restrictions.isNotNull("child"));

但是没有用,请给我一个例子,能帮我吗?谢谢


问题答案:

首先,映射是错误的。在父类中,您是说该关联是由映射的child.parent,而在您说该关联是使用名为的连接列进行映射之后id_child。下定决心
它是由child.parent属性映射的,应该删除@JoinColumn。或者它是由JoinColumn映射的,您应该@PrimaryKeyJoinColumn在子级中删除,并mappedBy="child"在Child实体中使用。

现在,要使查询正常工作,无论映射是什么,您都应该简单地进行内部联接:

Criteria criteria = session.createCriteria(Parent.class);
criteria.createAlias("child"); // inner join

由于联接是内部联接,因此它将仅选择具有非空子代的父母。



 类似资料:
  • 首先,我知道这个查询有点混乱,但它可以正常工作,直到至少有一条记录存在,并且设置为true,此时没有返回任何记录。如果有另一条记录的设置为false或两者的组合,则它可以正常工作,即返回的记录的所有票证总数都设置为0或适当的值。 我已将查询更新为,并将票证表联接更改为left(也尝试了full outer),但它仍然存在上述问题。 为什么会发生这种情况,我能做些什么来防止它?

  • 问题内容: 我的数据库表中具有以下格式的数据: 该列将来自该列的数据作为父记录。带有值的表示根项目。我需要编写查询以按以下顺序获取数据: 我需要得到根记录(与记录为0),然后是所有和这根记录,然后获得下根的记录,然后和在这个根记录等等。 问题答案: 我在这里提出的解决方案使用了物化路径的概念。以下是使用样本数据的实例化路径的示例。我希望它可以帮助您理解物化路径的概念: 每个节点都有一个实例化路径,

  • 问题内容: 一个活动有很多参与者。参与者的字段为“状态”。 我需要找到除以下事件以外的所有事件:每个参与者的状态都为“出席”的事件。 我可以找到带有以下AR代码的某些参与者处于“呈现”状态的所有事件: 这样就创建了SQL: 这 几乎 可行。问题是,如果参与者的某行(在范围内 )的状态为“离开”,则该事件仍将被获取,因为至少某些同级记录的状态与其他状态相同而不是“现在”。 我需要确保我正在过滤所有事

  • 我有一个动觉流(20个片段),大约有1天的数据延迟,这是由基于KCL的动觉消费者消费的。消费者部署了20个ECS实例,因此每个实例都有一个从每个shard提取数据的线程。 根据文档,看起来一个getRecords调用最多可以获取10000条记录,或者最大负载大小为10 MB。然而,当我监视消费者日志时,并不是所有的碎片都达到了这个限制。使用单个getRecords调用获取的记录在消费者实例中非常不

  • 问题内容: 我想使用Hibernate的 Criteria API ,选择表中具有给定列最大值的记录。 我试图用投影,创造一个别名为,然后使用它,但它不断告诉我“ 无效号码 ”。 用Hibernate做到这一点的正确方法是什么? 问题答案: 您可以使用来表示子查询,如下所示: 参考文献 Hibernate Core参考指南 15.8。分离的查询和子查询

  • 我有一个父表和子表。父记录已由其他进程插入。我需要添加引用父记录的子记录,例如: 插入CHILD记录时,引用父记录的唯一信息是地址。我需要从父表中获取PARENT_ID,使用子的ADDRESS来设置子的FK。 在hibernate中有没有一种方法可以做到这一点,这样我就不需要通过地址查询父项来将其与子记录一起插入?或者,我是否继续沿着这条路径,按地址查询父对象,然后将父对象传递给子对象?