【问题标题】:How to write JPA criteria query select a with JOIN如何编写 JPA 条件查询 select a with JOIN
【发布时间】:2020-10-31 02:17:38
【问题描述】:

我在如何编写加入和从应用程序中选择时遇到问题

所以我必须实体应用程序和停用

deactivated 有一个字段:

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "application_id")
private Application application;

并且应用程序有:

@Id
private Long id;

我不知道如何用语言来描述这个问题,所以我就粘贴一下 JPQL:

SELECT a FROM applications a LEFT OUTER JOIN deactivated_applications da on a.id = da.application_id WHERE da.filedeactivated=false;

我收到参数的查询代码:

{    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Application> cq = criteriaBuilder.createQuery(Application.class);
        Root<Application> root = cq.from(Application.class);
        //SearchQuery to TO SQLsearchQuery to specification, to Predicate
        Predicate searchQueryPredicate = null;
        if (!searchQuery.getCriteria().isEmpty())
            searchQueryPredicate = SqlSearchQuery.of(searchQuery).toSpecification(Application.class).toPredicate(root, cq, criteriaBuilder);}

现在我需要让这个查询在之前的 SQL 查询上运行

【问题讨论】:

  • 抱歉标题愚蠢。我不知道怎么问
  • 只写查询而不是使用数据库结构使用java对象。
  • 问题是:我需要写这个,然后我还收到一个 SearchQuery,它需要在第一个结果上。我可以以某种方式将 2 个查询合并为 1 个吗?比如:Query q2 = entityManager.createNamedQuery("Application.findWithFileActive") Query q1 = entityManager.createQuery(cq.where(searchQueryPredicate)) 和 q1.where(q2) ?
  • 没有。要么将其组合成单个查询,要么使用 java.xml 过滤获取的数据。如果你想动态创建查询然后检查 jpa 标准。
  • 我正在使用第一个查询的条件,但我无法从条件 Api 中获取第一个。我会用代码更新问题

标签: java hibernate jpa criteria-api criteriaquery


【解决方案1】:

这看起来像是可以通过子选择解决的问题。

要从应用程序 ID 属于已停用应用程序且 filedeactivate 为假的应用程序中进行选择,请使用以下类型的查询结构:

SELECT a FROM applications a WHERE a.Id MEMBER OF (SELECT b.application_id FROM deactivatedapplications b WHERE b.filedeactivated = false)

使用https://thorben-janssen.com/jpql/#Subselects 中的书籍和作者示例描述了此方法,其中 Thorben 使用子选择来选择写过不止一本书的作者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    相关资源
    最近更新 更多