spring JPA中对自定义实体的查询经验

最近用jpa+spring写后台,遇到了之前没见过用过的jpa标准查询,特别是目前业务中需要使用自定义实体,说个经验。

因为写自定义实体查询的时候,老是报错:

<pre name="code" class="java">org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate approp               
  [com.gxytfb.mrd.wrapper.view.CustomerMaintainProcessHistoryView]. 
  Expected arguments are: 
  java.lang.String, 
  java.lang.String, 
  java.lang.String, 
  int, 
  java.lang.String, 
  java.util.Date, 
  java.lang.String, 
  java.util.Date, 
  java.lang.String, 
  java.lang.String, 
  java.util.Date, 
  java.lang.String, 
  java.lang.String, 
  java.lang.String, 
  java.lang.String, 
  java.lang.String, 
  java.lang.String 
  [select new com.gxytfb.mrd.wrapper.view.CustomerMaintainProcessHistoryView(
  	generatedAlias0.uuid, 
  	generatedAlias0.processId, 
  	generatedAlias0.processStatus, 
  	generatedAlias0.customerInfoSubType, 
  	generatedAlias0.inputUserUuid, 
  	generatedAlias0.inputDate, 
  	generatedAlias0.firstTaskUserUuid, 
  	generatedAlias0.firstTaskDate, 
  	generatedAlias0.firstTaskRemark, 
  	generatedAlias0.secondTaskUserUuid, 
  	generatedAlias0.secondTaskDate, 
  	generatedAlias0.secondTaskRemark, 
  	generatedAlias1.ownershipType, 
  	generatedAlias2.customerId, 
  	generatedAlias2.customerName, 
  	generatedAlias2.customerType, 
  	generatedAlias2.customerStatus) from com.gxytfb.mrd.domain.CustomerInfoMaintainProcess as generatedAlias0 left join generatedAlias0.customerOwnerships as generatedAlias1 left join generatedAlias0.customer as generatedAlias2]
  	


 

看上去是说自定义实体的入参跟标准查询查出来的字段没有对应上。

先来个自定义实体,实体属性略过,首先要注意,实体构造器一定要把想要的属性都加上。比如,下面有17个属性入参。

public CustomerMaintainProcessHistoryView(String processUuid,
                                              String processId,
                                              String processStatus,
                                              int customerInfoSubType,
                                              String inputerUserName,
                                              Date inputDate,
                                              String checkerUserName,
                                              Date checkDate,
                                              String checkRemark,
                                              String reviewerUserName,
                                              Date reviewDate, String reviewerRemark,
                                              String ownershipType,String customerId, String customerName,
                                              <strong>String customerType</strong>, String customerStatus) {

        this.processUuid = processUuid;
        this.processId = processId;
        this.customerId = customerId;
        this.customerName = customerName;
        this.customerType = customerType;
        this.customerInfoSubType = customerInfoSubType;
        this.customerStatus = customerStatus;
        this.processStatus = processStatus;
        this.inputerUserName = inputerUserName;
        this.inputDate = inputDate;
        this.checkRemark = checkRemark;
        this.checkerUserName = checkerUserName;
        this.checkDate = checkDate;
        this.reviewerRemark = reviewerRemark;
        this.reviewerUserName = reviewerUserName;
        this.reviewDate = reviewDate;
        this.ownershipType = ownershipType;
    }

<pre name="code" class="java"><span>	</span>//原先上面的报错就是因为 <strong>String customerType </strong>写成了 <strong>int customerType</strong>,改过来就没事

 


然后在要写jpa标准查询的函数中,我使用了join。上代码

//查询标准构造器
        CriteriaBuilder cb = em.getCriteriaBuilder();
        //主查询
        CriteriaQuery<CustomerMaintainProcessHistoryView> cqMain = cb.createQuery(CustomerMaintainProcessHistoryView.class);
        ///join关联查询
        Root<CustomerInfoMaintainProcess> tBase = cqMain.from(CustomerInfoMaintainProcess.class);//主表
        Join<CustomerInfoMaintainProcess, CustomerOwnership> joinOwnership = tBase.join("customerOwnerships", JoinType.LEFT);//左联结客户归属表
        Join<CustomerInfoMaintainProcess, Customer> joinCustomer = tBase.join("customer", JoinType.LEFT);//左联结客户信息表

        //拼装自定义实体的查询。查询的字段要跟自定义实体的构造器参数顺序一样
        cqMain.multiselect(
                //流程信息
                tBase.get("uuid").alias("processUuid"),
                tBase.get("processId").alias("processId"),
                tBase.get("processStatus").alias("processStatus"),
                tBase.get("customerInfoSubType").alias("customerInfoSubType"),
                tBase.get("inputUserUuid").alias("inputerUserName"),
                tBase.get("inputDate").alias("inputDate"),
                tBase.get("firstTaskUserUuid").alias("checkerUserName"),
                tBase.get("firstTaskDate").alias("checkDate"),
                tBase.get("firstTaskRemark").alias("checkRemark"),
                tBase.get("secondTaskUserUuid").alias("reviewerUserName"),
                tBase.get("secondTaskDate").alias("reviewDate"),
                tBase.get("secondTaskRemark").alias("reviewerRemark"),
                //管户类型
                joinOwnership.get("ownershipType").alias("ownershipType"),
                //客户信息
                joinCustomer.get("customerId").alias("customerId"),
                joinCustomer.get("customerName").alias("customerName"),
                joinCustomer.get("customerType").alias("customerType"),
                joinCustomer.get("customerStatus").alias("customerStatus")
        );


   tBase.get("uuid").alias("processUuid"),//get是对应从哪里取值的属性名,alias是对应自定义实体的属性名
现在属性的队形已经对好,查询就不会报错。

<span>	</span>//原先上面的报错就是因为 String customerType写成了 int customerType,改过来就没事
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值