Java JPA标准规范-带group by的multiselect返回所有列

Java JPA标准规范-带group by的multiselect返回所有列,java,spring-boot,spring-mvc,spring-data-jpa,criteria-api,Java,Spring Boot,Spring Mvc,Spring Data Jpa,Criteria Api,我正在尝试使用JPA规范和标准在表上实现基本的GROUPBY。我使用query.multiselect并提供了一列。但是,在执行过程中,正在构建SQL查询以获取所有列。理论上,一切看起来都很好。我不知道我会错在哪里 以下是服务方法 public List<POJO> fetchInwardnventoryGroupByUsingSpec() throws ParseException { Specification<InwardInventory>

我正在尝试使用JPA规范和标准在表上实现基本的GROUPBY。我使用query.multiselect并提供了一列。但是,在执行过程中,正在构建SQL查询以获取所有列。理论上,一切看起来都很好。我不知道我会错在哪里

以下是服务方法

public List<POJO> fetchInwardnventoryGroupByUsingSpec() throws ParseException 
    {
        Specification<InwardInventory> spec = findAllGroupBy();
        List<POJO> iiData = inwardInventoryRepo.findAll(spec);  
        return iiData;
    }
    
    public static Specification<InwardInventory> findAllGroupBy() 
    {
        return new Specification<InwardInventory>()
        {
            @Override
            public Predicate toPredicate(Root<InwardInventory> root, CriteriaQuery<?> query, CriteriaBuilder cb) 
            {
                query.multiselect(root.get(InwardInventory_.VEHICLE_NO),cb.count(root));
                query.groupBy(root.get(InwardInventory_.VEHICLE_NO));
                return query.getRestriction();
            }
        };
    }
下面是实体类

@Entity
@Table(name = "inward_inventory")
@Audited
@Where(clause = ReusableFields.SOFT_DELETED_CLAUSE)
public class InwardInventory extends ReusableFields implements Cloneable
{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="inwardid")
    Long inwardid;
    
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")
    @Column(nullable = false)
    @NonNull
    Date date;
    
    @NonNull
    String vehicleNo;
    
    String supplierSlipNo;
    
    String ourSlipNo;
    
    @ManyToMany(fetch=FetchType.EAGER,cascade = CascadeType.ALL)
    @JoinTable(name = "inwardinventory_entry", joinColumns = {
            @JoinColumn(name = "inwardid", referencedColumnName = "inwardid") }, inverseJoinColumns = {
                    @JoinColumn(name = "entryId", referencedColumnName = "entryId") })
    Set<InwardOutwardList> inwardOutwardList = new HashSet<>();;
    
    @ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL)
    @JoinColumn(name="warehouse_id",nullable=false)
    @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
    Warehouse warehouse;
    
    @ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL)
    @JoinColumn(name="contactId",nullable=false)
    @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
    Supplier supplier;
    
    String additionalInfo;
    
    @NonNull
    @Column(nullable = false)
    Boolean invoiceReceived;
//getter/setter
}
@实体
@表(name=“内部库存”)
@审计
@其中(子句=ReusableFields.SOFT\u DELETED\u子句)
公共类InwardInventory扩展可重用字段实现可克隆
{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“inwardid”)
长内向;
@JsonFormat(shape=JsonFormat.shape.STRING,pattern=“yyyy-MM-dd”)
@列(nullable=false)
@非空
日期;
@非空
串珠车;
字符串供应商SLIPNO;
系上我们的绳子;
@ManyToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@JoinTable(name=“inwardinventory\u entry”,JointColumns={
@JoinColumn(name=“inwardid”,referencedColumnName=“inwardid”)},inverseJoinColumns={
@JoinColumn(name=“entryId”,referencedColumnName=“entryId”)})
Set inwardOutwardList=新HashSet();;
@manytone(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@JoinColumn(name=“warehouse\u id”,null=false)
@JsonIgnoreProperties({“HibernateLazInitializer”,“handler”})
仓库;
@manytone(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@JoinColumn(name=“contactId”,nullable=false)
@JsonIgnoreProperties({“HibernateLazInitializer”,“handler”})
供应商;
字符串附加信息;
@非空
@列(nullable=false)
布尔发票已收到;
//吸气剂/塞特
}

经过几天的努力,终于知道这是一个已知的问题

因此,我通过自动连接实体管理器来处理它,然后创建所有必需的谓词和查询。然后调用getResults()而不是findall()

@Autowired
实体管理器实体管理器;
public List getResults()引发异常
{
CriteriaQuery=modelSpecification.getSpecQuery();
List allData=entityManager.createQuery(query.getResultList();
返回所有数据;
}
@Entity
@Table(name = "inward_inventory")
@Audited
@Where(clause = ReusableFields.SOFT_DELETED_CLAUSE)
public class InwardInventory extends ReusableFields implements Cloneable
{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="inwardid")
    Long inwardid;
    
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")
    @Column(nullable = false)
    @NonNull
    Date date;
    
    @NonNull
    String vehicleNo;
    
    String supplierSlipNo;
    
    String ourSlipNo;
    
    @ManyToMany(fetch=FetchType.EAGER,cascade = CascadeType.ALL)
    @JoinTable(name = "inwardinventory_entry", joinColumns = {
            @JoinColumn(name = "inwardid", referencedColumnName = "inwardid") }, inverseJoinColumns = {
                    @JoinColumn(name = "entryId", referencedColumnName = "entryId") })
    Set<InwardOutwardList> inwardOutwardList = new HashSet<>();;
    
    @ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL)
    @JoinColumn(name="warehouse_id",nullable=false)
    @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
    Warehouse warehouse;
    
    @ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL)
    @JoinColumn(name="contactId",nullable=false)
    @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
    Supplier supplier;
    
    String additionalInfo;
    
    @NonNull
    @Column(nullable = false)
    Boolean invoiceReceived;
//getter/setter
}
@Autowired
    EntityManager entityManager;
    public List<Model> getResults() throws ParseException 
    {
        CriteriaQuery<Model> query = modelSpecification.getSpecQuery();
        List<Model> allData  = entityManager.createQuery(query).getResultList();
        return allData;
    }