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

JPA条件API查询子类属性

汪明德
2023-03-14
private List<Subject> q1()
{
    CriteriaBuilder b = em.getCriteriaBuilder();

    CriteriaQuery<Subject> q = b.createQuery(Subject.class);
    Root<Subject> r = q.from(Subject.class);
    q.select(r);
    q.distinct(true);
    q.where(
        b.or(
            b.like(r.get(Subject_.name), "a%"),
            b.like(b.treat(r, Person.class).get(Person_.lastName), "a%")));

    return em.createQuery(q).getResultList();
}

显然,person扩展了subjectsubject抽象的,继承是single_tablesubject具有 @discriminatoroptionsforce=true其他原因

但生成的SQL是这样的:

select distinct subject0_.ID as ID2_71_, subject0_.CODE as CODE3_71_, ...
from SUBJECT subject0_ 
where subject0_.DTYPE='Person' and (subject0_.name like 'a%' or subject0_.lastName like 'a%')

在我期待的时候:

select distinct subject0_.ID as ID2_71_, subject0_.CODE as CODE3_71_, ...
from SUBJECT subject0_ 
where subject0_.name like 'a%' or (subject0_.DTYPE='Person' and subject0_.lastName like 'a%')

请注意

  • 使用另一根-Q.From(Person.class)
  • 使用子查询-q.subquery(Person.class)
  • 将lastName字段上移到主题
  • 使用本机查询
  • 使用实体图

是不能接受的。

我感兴趣的是可以在WHERE子句中直接声明和使用的东西(仅从CriteriaBuilder和/或单个Root生成,就像TREATE()子句一样)(如果确实存在的话)。

共有1个答案

丌官运珧
2023-03-14

对于Hibernate,在这个特定的场景中,解决方案非常简单:

private List<Subject> q1()
{
    CriteriaBuilder b = em.getCriteriaBuilder();

    CriteriaQuery<Subject> q = b.createQuery(Subject.class);
    Root<Subject> r = q.from(Subject.class);
    q.select(r);
    q.distinct(true);
    q.where(
        b.or(
            b.like(r.get(Subject_.name), "a%"),
            b.and(
                b.equal(r.type(), Person.class),
                b.like(((Root<Person>) (Root<?>) r).get(Person_.lastName), "a%"))));

    return em.createQuery(q).getResultList();
}

注意双重强制转换,它避免了编译错误,并允许对同一表执行查询子句。这将生成:

select distinct subject0_.ID as ID2_71_, subject0_.CODE as CODE3_71_, ...
from SUBJECT subject0_ 
where subject0_.DTYPE in ('Office', 'Team', 'Role', 'Person', ...) 
    and (subject0_.name like 'a%' 
        or subject0_.DTYPE='Person' and (subject0_.lastName like 'a%'))

没有必要改变模型或其他任何东西。

 类似资料:
  • 现在我扪心自问,是不是有什么“点符号”或者其他什么东西让这个案例变得可有可无。在E。例如:本机SQL我会做一些事情,比如创建一个子查询,并从内部投影中选择所有别名值()。 如果有任何建议,我将不胜感激。

  • 我正在努力使用JPA标准API来为我的数据结构制定一个查询。好的,我的实体如下。我有用户和组(两者共享一个公共的基类OrgEntity)。从逻辑上讲,用户当然可以是多个组中的成员。最后,我有一个表示任务的实体,它有一个潜在所有者的列表(可以是单个用户,也可以是整个组)。域模型总结在下面,是给出的,所以我不能改变它。 查询的起点是User的单个实例。我想知道用户是潜在所有者的所有任务(无论用户是直接

  • 如何创建高效的 JPA 条件查询,以便仅当实体存在于联接表中时才选择实体列表?例如,采用以下三个表: 有问题的查询(我希望 JPA 生成什么)是: 以下条件查询将产生类似的结果,但有两个连接: 根本问题似乎是我对USER_WORKGROUP连接表使用@JoinTable注释,而不是对连接表使用单独的@Entity,所以我似乎不能在条件查询中将USER_WORGGroup用作根。 以下是实体类:

  • 我一直在mysql中使用Spring data JPA。我主要使用以下查询方法: 但现在,对于一些用例,我想如下所示: 我不明白我怎么能同时使用它们。因为如果我想使用criteria api,我必须创建一个具体的类。如果我创建了一个具体的类,我不明白如何使用jpa查询方法,就好像我实现了接口一样,我必须提供一个实现。 谁能帮我一下吗。

  • 我试图转换这个JPQL查询;