Java JPA标准规范-带group by的multiselect返回所有列
我正在尝试使用JPA规范和标准在表上实现基本的GROUPBY。我使用query.multiselect并提供了一列。但是,在执行过程中,正在构建SQL查询以获取所有列。理论上,一切看起来都很好。我不知道我会错在哪里 以下是服务方法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>
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;
}