您的位置:首页 > 编程语言 > Java开发

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

2016-01-13 10:15 375 查看
最近用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,改过来就没事
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: