繁体   English   中英

JPA:按不同的列选择任何行

[英]JPA: Select any row by distinct column

我有一个 SQL 表,其中包含一些这样的数据:

------------------+------------------------+------------------------
      Name        +        Zone            +      School
-------------------------------------------+------------------------
      Joe         +  Coolzone              +   VCU
      Mike        +  ReallyCoolZone        +   ODU
      Kyle        +  NotcoolZone           +   ODU

我在这里尝试做的是使用 JPA 仅选择一行,包括区域和学校,其中学校是不同的。

因此,我期望结果:

CoolZone, VCU
ReallyCoolZone, ODU

我试图在 JPA 中发出这样的查询,但我收到一条错误消息,指出返回了多个结果:

select distinct a.zone, a.school from MyEntity a

根据我所阅读的内容,这个错误是有道理的,原因有两个。 a) 当我们发出 select 语句时,我们不会返回整个实体,而是返回部分 b) jpa 不知道如何将这些值映射到我的实体。

根据我所阅读的内容,我可以通过创建一个新的构造函数并明确说明应如何构造返回的对象来解决这个问题。 这在这篇文章中提到: https : //stackoverflow.com/a/24710759/5655414

创建新的构造函数后,我的查询字符串等同于以下内容:

select new MyEntity(distinct a.zone, a.school) from MyEntity a

我收到一条错误消息:

 Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: distinct

这个应该放在什么位置? 如果这段代码是疯狂的并且毫无意义,是否有更有效的方法来实现我的目标?

JPA 2.0 休眠 3.4

这个问题的解决方案相当简单。 首先,我们必须为我们寻找的多选列添加条件,并将 distinct 设置为 true:

final CriteriaBuilder builder = em.getCriteriaBuilder();
final CriteriaQuery<MyEntity> criteriaQuery = builder.createQuery(MyEntity.class);
final Root<MyEntity> myEntity= criteriaQuery.from(MyEntity.class);
final CriteriaQuery<MyEntity> select = criteriaQuery.multiselect(
                myEntity.get("zone"), versionTrack.get("school"));
select.distinct(true);

然后,我们必须为 MyEntity 类创建一个额外的构造函数,以便可以从结果中创建它:

public MyEntity(final String zone, final String school) {...}

这样的东西行不通?

select min(a.zone), a.school from MyEntity a group by a.school

我也面临同样的问题。 但是阅读了很多网站,有了解决问题的想法,现在工作正常。 JPA 构造函数不允许 ' distinct ',所以我在构造函数之外尝试。 任何人找到了更好的解决方案,您可以发表评论。

代码

@Query("select distinct new com.apptium.eportalcdcdaas.model.CDCField(dl.fieldname,dl.fieldDataType,dl.fieldDesc,"
            + "dl.fieldPath,dl.parentdomainid,dl.primaryKey) from Delta dl where dl.accountName = ?1 and dl.applicationName = ?2"
            + " and dl.domainid = ?3 and dl.subDomainid = ?4")
    List getFieldWithDomainAndSubDomain(String accountname, String applicationname, String domainId,
            String subDomainId);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM