当前位置: 首页 > 知识库问答 >
问题:

按条件搜索继承实体

贺轶
2023-03-14

我有根实体:

@Entity
@DiscriminatorValue("MORAL")
public class MoralEntity {

    private static final long serialVersionUID = 1L;

    @Id
    private String internalId;

    @OneToOne(cascade = CascadeType.ALL, optional = true)
    @JoinColumn(name = "fk_partner", nullable = true, updatable = true)
    private PartnerEntity partner;
    
}

与父实体有关系的:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "pType", discriminatorType = DiscriminatorType.STRING)
public class PartnerEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private String internalId;

    @Column(insertable = false, updatable = false)
    private String pType;
    
}

还有子实体:

@Entity
@DiscriminatorValue("E1")
public class Entity1 extends PartnerEntity {

    private static final long serialVersionUID = 1L;

    @Embedded
    private CategoryEntity category;

}

@Entity
@DiscriminatorValue("E2")
public class Entity2 extends PartnerEntity {

    private static final long serialVersionUID = 1L;

    @Embedded
    private CategoryEntity category;

}

@Entity
@DiscriminatorValue("E3")
public class Entity3 extends PartnerEntity {

    private static final long serialVersionUID = 1L;

}

我想搜索partner.category.code="ABC"的所有MoralEntity。

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MoralEntity> query = cb.createQuery(MoralEntity.class);
Root<MoralEntity> root = query.from(MoralEntity.class);

Join<MoralEntity, PartnerEntity> moralPartnerJoin = root.join("partner");

共有1个答案

孟品
2023-03-14

此查询应该可以:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MoralEntity> query = cb.createQuery( MoralEntity.class );
Root<MoralEntity> root = query.from( MoralEntity.class );
Join<MoralEntity, PartnerEntity> partnerJoin = root
        .join( "partner" );

// OPTIONAL: This will remove all Entity3 entries
partnerJoin.on( partnerJoin.type().in( Entity1.class, Entity2.class ) );

Path<Object> code1 = cb.treat( partnerJoin, Entity1.class )
        .get( "category" ).get( "code" );
Predicate p1 = cb.equal( code1, "ABC" );

Path<Object> code2 = cb.treat( partnerJoin, Entity2.class )
        .get( "category" ).get( "code" );
Predicate p2 = cb.equal( code2, "ABC" );

query.where( cb.or( p1, p2 ) );

List<MoralEntity> resultList = em.createQuery( query ).getResultList();

但是,此条件将生成一个使用三个联接的SQL查询:

    select
        ormreactiv0_.internalId as internal1_0_,
        ormreactiv0_.fk_partner as fk_partn2_0_ 
    from
        Moral ormreactiv0_ 
    inner join
        Partner ormreactiv1_ 
            on ormreactiv0_.fk_partner=ormreactiv1_.internalId 
            and (
                ormreactiv1_.pType in (?, ?)
            ) 
            inner join
                Partner ormreactiv2_ 
                    on ormreactiv0_.fk_partner=ormreactiv2_.internalId 
            inner join
                Partner ormreactiv3_ 
                    on ormreactiv0_.fk_partner=ormreactiv3_.internalId 
            where
                ormreactiv2_.code=? 
                or ormreactiv3_.code=?

如果这会导致性能问题,我会考虑将类别字段移动到超类或使用本机查询。

 类似资料:
  • 我有一个类型<code>build</code>有一个标志模板,根据活动标志位,它从这些类型继承。这使我可以从具有大量配置的许多子类中“构建”类: 所以< code >构建 但它不编译,说<code>空</code>已经是一个直接基类: 我怎样才能做到这一点,而不必创建4个不同的空结构来避免冲突呢?

  • 条款36: 区分接口继承和实现继承 (公有)继承的概念看起来很简单,进一步分析,会发现它由两个可分的部分组成:函数接口的继承和函数实现的继承。这两种继承类型的区别和本书简介中所讨论的函数声明和函数定义间的区别是完全一致的。 作为类的设计者,有时希望派生类只继承成员函数的接口(声明);有时希望派生类同时继承函数的接口和实现,但允许派生类改写实现;有时则希望同时继承接口和实现,并且不允许派生类改写任何

  • 本文向大家介绍solr 提高搜索条件,包括了solr 提高搜索条件的使用技巧和注意事项,需要的朋友参考一下 示例 name:(john doe^5) 该^指标可以用来提高搜索项,以增加它的重要级别的含义,包含文件母鹿更多相关比含那些约翰

  • 我有一个简单的类,注释为 例如: 然后我有一个扩展这个bean的配置bean: 似乎忽略了有条件的,无论条件如何解决,都会始终处理配置(甚至没有调用) 只要我将有条件注释移动到MyConfig,一切都会正常工作。 从文档: @条件注释可以以下列任何一种方式使用: 作为使用@组件直接或间接注释的任何类的类型级注释,包括@配置类 我假设第一点适用于这里,即MyConfig间接地用配置注释。或者间接引用

  • 在SublimeText 2中,我可以执行以下操作:<code>cmd t</code> 然后键入文件名或文件夹名,显示的结果是与我正在搜索的术语匹配的文件,以及位于我正在搜索的术语的子文件夹中的文件,例如,如果我的目录结构如下所示: 我可以做命令 和类型和唯一的两个选项,将显示将是和文件,我可以键向下导航或键入添加更多的搜索词和唯一的选项将是 如何在RubyMine中获得相同的功能

  • 我在术语查询中要求弹性搜索中的嵌套字段,其中嵌套字段值应与术语查询中提供的值的数量完全匹配。例如,考虑下面的查询,在这里我们对名为类型的嵌套字段进行查询。 GET资产/_search 索引映射 样本文件: 上述查询应返回字段类型正好有2个值的文档,即“VOD”