spring JPA中对自定义实体的查询经验
2016-01-13 10:15
375 查看
最近用jpa+spring写后台,遇到了之前没见过用过的jpa标准查询,特别是目前业务中需要使用自定义实体,说个经验。
因为写自定义实体查询的时候,老是报错:
看上去是说自定义实体的入参跟标准查询查出来的字段没有对应上。
先来个自定义实体,实体属性略过,首先要注意,实体构造器一定要把想要的属性都加上。比如,下面有17个属性入参。
然后在要写jpa标准查询的函数中,我使用了join。上代码
因为写自定义实体查询的时候,老是报错:
<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,改过来就没事
相关文章推荐
- Spring Security笔记:使用BCrypt算法加密存储登录密码
- eclipsesvn总是提示输入密码?svn总是提示输入密码的解决!
- Spring MVC 通过@Value注解读取.properties配置内容
- eclipse中快捷键
- Java内存溢出详解
- hibernate的配置1
- JAVA线程同步辅助类CountDownLatch
- java 提取目录下所有子目录的文件到指定位置
- 深入浅出RxJava(一:基础篇)
- 国外用spring开发的开源系统值得学习
- eclipse Debug 技巧
- java 线程
- Eclipse中如何添加Junit jar包
- Myeclipse中快捷键大全
- Java使用“==”所遇到的坑
- java中静态代码块的使用场景
- Spring框架的使用
- 把Eclipse自带的浏览器修改为自己习惯的浏览器
- 修改Eclipse格式化代默认长度
- Struts2配置