小编Pet*_*ály的帖子

如何在 JPA 查询中编写 MAX 和 OVER (PARTITION BY) 函数

我需要根据另一列(绘图编号)获取一列(修订版)最大值。谁能告诉我此功能的 JPA 查询。

我编写了以下查询,但该查询不起作用。

请帮助我如何在 JPA 查询中编写 MAX 和 OVER (PARTITION BY) 函数。

    @Query("select dr FROM
        (SELECT MAX(dr.revision) over (PARTITION BY d.drawing_number) AS latest_revision
        FROM DrawingRate dr
        JOIN dr.drawing d
        JOIN d.modifiedBy mb
        WHERE mb.Id=:Id
        OR piu.Id=:Id
        ORDER BY d.localModifiedOn DESC NULLS LAST
        ) WHERE dr.revision = :latest_revision")
Run Code Online (Sandbox Code Playgroud)

运行此 Spring 数据 JPA 查询时不起作用,显示以下错误:

引起原因:java.lang.IllegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException:意外标记:(第1行附近第16列[select dr from (select max(dr.revision) over (partition by d.drawing_number) ) AS last_enrolment_date 来自实体.DrawingRate dr join dr.drawing d JOIN d.modifiedBy mb left join dr.modifiedBy u WHERE mb.Id=:IdOR piu.Id=:Id …

jpa window-functions spring-data-jpa

7
推荐指数
0
解决办法
7416
查看次数

具有CONTAINS功能的JPA Criteria api

我正在尝试使用CONTAINS函数(MS SQL)创建Criteria API查询:

select*from com.t_person where where(last_name,'xxx')

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

Expression<Boolean> function = cb.function("CONTAINS", Boolean.class, 
root.<String>get("lastName"),cb.parameter(String.class, "containsCondition"));
cq.where(function);
TypedQuery<Person> query = em.createQuery(cq);
query.setParameter("containsCondition", lastName);
return query.getResultList();
Run Code Online (Sandbox Code Playgroud)

但是获得异常:org.hibernate.hql.internal.ast.QuerySyntaxException:意外的AST节点:

有帮助吗?

java jpa

6
推荐指数
2
解决办法
2万
查看次数

当集合为空时出现 OneToMany LazyInitializationException

我知道有几十个问题具有相同的主题,但我无法弄清楚为什么它们在我的案例中不起作用。

我有两张表,一张的名称为 Account,一张的名称为 CustomerRelations,它们之间存在一对多的关系(一个帐户可以属于多个 customerRelations...一个帐户可以在没有其他客户关系的情况下存在,但有一个客户关系只能附加到现有帐户)

这就是它们在我的实体类中的注释方式:

账户表:

@OneToMany(mappedBy = "account", cascade = CascadeType.ALL, orphanRemoval = true)
@OnDelete(action = OnDeleteAction.CASCADE)
private List<CustomRel> customRels = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

客户关系表:

@ManyToOne(fetch = FetchType.EAGER)
private Account account;
Run Code Online (Sandbox Code Playgroud)

我有业务逻辑,我想根据“帐户”选项卡中保存的特定日期调用查询:

@NamedQuery(name = Account.FIND_BY_ACC_NBR, query = "select acc from Account acc where acc.accountNumber =:accountNumber")
Run Code Online (Sandbox Code Playgroud)

此查询提供了帐户表中的正确数据,但对于字段 customerRels 我得到以下异常:

**Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception.**
Run Code Online (Sandbox Code Playgroud)

当在我的 Account 对象上调用 getter 方法时,也会出现同样的情况:

在此输入图像描述

在我的示例中,有一个帐户对象,其中的 customerRels 列表为空。因此数据库中没有与 accountId 连接的 customerRels 记录。

据我所知,我的Account实体类中的fetchType是lazy-默认的,对吧?

在我创建表的 SQL 脚本中,CustomerRelations 表中仅添加了 account_id,Account 表中没有对子对象的引用。

我知道这是一个非常平庸的问题,但我需要一些帮助。我应该修改我的 JPQL 查询吗?

hibernate jpa eager jpql

1
推荐指数
1
解决办法
6057
查看次数

标签 统计

jpa ×3

eager ×1

hibernate ×1

java ×1

jpql ×1

spring-data-jpa ×1

window-functions ×1