Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA:按不同列选择任意行_Java_Hibernate_Jpa - Fatal编程技术网

Java JPA:按不同列选择任意行

Java JPA:按不同列选择任意行,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个SQL表,其中包含以下数据: ------------------+------------------------+------------------------ Name + Zone + School -------------------------------------------+------------------------ Joe + Coolzone

我有一个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不知道如何将这些值映射到我的实体

根据我所读的内容,我可以通过创建一个新的构造函数并明确说明如何构造返回的对象来解决这个问题。这篇文章在这里提到:

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

select new MyEntity(distinct a.zone, a.school) from MyEntity a
我得到一个错误声明:

 Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: distinct
应将其放置在什么位置? 如果这个代码是疯狂的,毫无意义,有没有更有效的方法来实现我的目标

JPA2.0
Hibernate 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);

这个问题的解决办法相当简单。首先,我们必须为我们寻找的多选列添加条件,并将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);

像这样的事情不行吗

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

像这样的事情不行吗

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

我也面临同样的问题。但是读了很多网站都有了解决这个问题的想法,现在效果不错。 JPA构造函数不允许使用“不同的”,因此我尝试在构造函数外部使用。如果有人找到更好的解决方案,你可以发表评论

代码

@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); @查询(“选择不同的新com.apptium.eportalcdcddaas.model.CDCField(dl.fieldname,dl.fieldDataType,dl.fieldDesc,” +“dl.fieldPath、dl.parentdomainid、dl.primaryKey)来自增量dl,其中dl.accountName=?1和dl.applicationName=?2” +“和dl.domainid=?3和dl.subDomainid=?4”) 列出getFieldWithDomainAndSubDomain(字符串accountname、字符串applicationname、字符串domainId、,
字符串子域ID) 我也面临同样的问题。但是读了很多网站都有了解决这个问题的想法,现在效果不错。 JPA构造函数不允许使用“不同的”,因此我尝试在构造函数外部使用。如果有人找到更好的解决方案,你可以发表评论

代码

@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); @查询(“选择不同的新com.apptium.eportalcdcddaas.model.CDCField(dl.fieldname,dl.fieldDataType,dl.fieldDesc,” +“dl.fieldPath、dl.parentdomainid、dl.primaryKey)来自增量dl,其中dl.accountName=?1和dl.applicationName=?2” +“和dl.domainid=?3和dl.subDomainid=?4”) 列出getFieldWithDomainAndSubDomain(字符串accountname、字符串applicationname、字符串domainId、, 字符串子域ID);