spring data jpa 想使用EntityManager 对sql 进行处理四种方式(第四种本人改写的)
2017-03-30 18:00
645 查看
下面看看主体的一个类:
输出结果:
*注意这里还有一个bug,那就是select * 这里会报错,因为sqlquery 是按照字段的别名来判断数据与实体的对应关系。所以这里如果写成是select * 回报一个异常是指无法匹配
这边有兴趣的就是看这个源码。spring data jpa 想使用entityManager 对sql 进行处理四种方式(第四种本人改写的)。
package com.chinait.service.impl; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.websocket.server.ServerEndpoint; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.transform.Transformers; import org.springframework.stereotype.Service; import com.chinait.service.TestService; import com.chinait.utils.Testtrans; import com.chinait.vo.Test; @Service public class TestServiceImpl implements TestService{ @PersistenceContext private EntityManager entityManager; @Override public void getTest(){ String sql = "select apps.appName,source.cutPath,sourcetype.sourceTypeName from apps join source on source.apps_id = apps.id join sourcetype on sourcetype.id = source.sourceType_id"; Session session = entityManager.unwrap(org.hibernate.Session.class); //返回类型是List<map> SQLQuery query2 = session.createSQLQuery(sql); query2.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); System.out.println("查询数据返回map"+query2.list()); //返回数据是list<List<Object>> SQLQuery query3 = session.createSQLQuery(sql); query2.setResultTransformer(Transformers.TO_LIST); System.out.println("查询数据返回map"+query2.list()); //返回类型是可定制化对象 SQLQuery query = session.createSQLQuery(sql); Testtrans Testtrans = new Testtrans(Test.class); query.setResultTransformer(Testtrans); List<Test> list = (List<Test>)query.list(); System.out.println("查询数据返回对象"+list); //返回数据是对象,首先这个方法有点坑,因为它需要去找寻bean 对应的对象是否是放在spring data jpa 的entity 如果不是的话回报错 /*SQLQuery query4 = session.createSQLQuery(sql); query.setResultTransformer(Transformers.aliasToBean(Test.class)); List<Test> list3 = (List<Test>)query.list(); System.out.println("查询数据返回对象"+list);*/ } }下面则是:我重写的一个类的源码:
package com.chinait.utils; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; import org.hibernate.transform.AliasToBeanResultTransformer; public class Testtrans extends AliasToBeanResultTransformer{ private Class resultClass; public Testtrans(Class resultClass) { super(resultClass); this.resultClass = resultClass; } private static final long serialVersionUID = 1L; public List transformTuple(Object[] tuple, String[] aliases) { List list = new ArrayList(); Object obj = null; try { obj = resultClass.newInstance(); } catch (InstantiationException e1) { e1.printStackTrace(); } catch (IllegalAccessException e1) { e1.printStackTrace(); } Method[] methods = resultClass.getMethods();// 返回这个类里面方法的集合 for(int k=0;k<aliases.length;k++){ String aliase=aliases[k]; char[] ch = aliase.toCharArray(); ch[0] = Character.toUpperCase(ch[0]); String s = new String(ch); String[] names = new String[] { ("set" + s).intern(), ("get" + s).intern(), ("is" + s).intern(), ("read" + s).intern() }; Method setter = null; Method getter = null; int length = methods.length; for (int i = 0; i < length; ++i) { Method method = methods[i]; /** * 检查该方法是否为公共方法,如果非公共方法就继续 */ if (!Modifier.isPublic(method.getModifiers())) continue; String methodName = method.getName(); for (String name : names) { if (name.equals(methodName)) { if (name.startsWith("set") || name.startsWith("read")) setter = method; else if (name.startsWith("get") || name.startsWith("is")) getter = method; } } } if(getter!=null){ Object[] param = buildParam(getter.getReturnType().getName(), tuple[k]); try { setter.invoke(obj, param); } catch (Exception e) { e.printStackTrace(); } } } list.add(obj); return list; } private final static Object[] buildParam(String paramType, Object value) { Object[] param = new Object[1]; if (paramType.equalsIgnoreCase("java.lang.String")) { param[0] = (String)(value); } else if (paramType.equalsIgnoreCase("int") || paramType.equalsIgnoreCase("java.lang.Integer")) { param[0] = (Integer)(value); } else if (paramType.equalsIgnoreCase("long")|| paramType.equalsIgnoreCase("java.lang.Long")) { param[0] = (Long)(value); } else if (paramType.equalsIgnoreCase("double")|| paramType.equalsIgnoreCase("java.lang.Double")) { param[0] = (Double)(value); } else if (paramType.equalsIgnoreCase("float")|| paramType.equalsIgnoreCase("java.lang.Float")) { param[0] = (Float)(value); } else if (paramType.equalsIgnoreCase("char") || paramType.equalsIgnoreCase("Character")) { param[0] = (char)(value); } return param; } }注意Test 的实体类:
package com.chinait.vo; //apps.appName,source.cutPath,sourcetype.sourceTypeName public class Test { private String appName; private String cutPath; private String sourceTypeName; public String getAppName() { return appName; } public void setAppName(String appName) { this.appName = appName; } public String getCutPath() { return cutPath; } public void setCutPath(String cutPath) { this.cutPath = cutPath; } public String getSourceTypeName() { return sourceTypeName; } public void setSourceTypeName(String sourceTypeName) { this.sourceTypeName = sourceTypeName; } @Override public String toString() { return "Test [appName=" + appName + ", cutPath=" + cutPath + ", sourceTypeName=" + sourceTypeName + "]"; } }
输出结果:
*注意这里还有一个bug,那就是select * 这里会报错,因为sqlquery 是按照字段的别名来判断数据与实体的对应关系。所以这里如果写成是select * 回报一个异常是指无法匹配
这边有兴趣的就是看这个源码。spring data jpa 想使用entityManager 对sql 进行处理四种方式(第四种本人改写的)。
相关文章推荐
- STS上使用spring data jpa对数据库单表进行增删改查(2)
- Spring Data JPA使用Sort进行排序(Using Sort)(转)
- spring使用编程的方式进行事物处理_普通方式和jdbctemplate方式
- Spring Data JPA使用Sort进行排序(Using Sort)
- 通过JPA注解映射视图的实体类 jpa 视图 无主键 @Query注解的用法(Spring Data JPA) jpa 使用sql语句
- 使用SpringData JPAQL获取查询结果query.getResultList()读取后EntityManager会自动关闭
- 使用spring-boot-starter-data-jpa 怎么配置使运行时输出SQL语句
- 一篇总结的很好的Spring data jpa 文章,里面包含多种查询方式,可以结合api使用
- spring-data-jpa——如果使用了one-to-many,many-to-one的注解,在Jackson进行json字符串化时出现错误的解决方案
- 使用spring-boot-starter-data-jpa 怎么配置使运行时输出SQL语句
- 【redis】5.spring boot项目中,直接在spring data jpa的Repository层使用redis +redis注解@Cacheable直接在Repository层使用,报错问题处理Null key returned for cache operation
- 使用spring-boot-starter-data-jpa 怎么配置使运行时输出SQL语句
- 使用Spring DATA JPA进行数据库开发
- spring-data-jpa 中,如果使用了one-to-many , many-to-one的注释,会在Jackson进行json字符串化的时候出现错误
- STS上使用spring data jpa对数据库单表进行增删改查
- 使用spring-data-jpa的JpaRepository来进行类的db操作(配置)
- spring-data-jpa 中,如果使用了one-to-many , many-to-one的注释,会在Jackson进行json字符串化的时候出现错误
- 使用临时表进行编号重排的处理示例.sql
- 使用spring的特殊bean --- 对bean进行后处理和对bean工厂进行后处理简单了解
- 使用T-SQL进行数据库备份并检查该备份文件是否存在且作出相应处理