hibernate 或jpa 中使用 AliasToBeanResultTransformer 自定义类型转换ResultTransformer 下划线转驼峰
jpa中使用 sql查询时,返回结果直接转为实体bean的实现,
需要自定义一个ResultTransformer,如下,
import java.util.Arrays; import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.property.ChainedPropertyAccessor;
import org.hibernate.property.PropertyAccessor;
import org.hibernate.property.PropertyAccessorFactory;
import org.hibernate.property.Setter;
import org.hibernate.transform.AliasToBeanResultTransformer; /**
* @Description :
* @Autor : xiongjinpeng jpx_011@163.com
* @Date : 2016年3月18日 上午10:05:00
* @version :
*/
public class SelfResultTransformer extends AliasToBeanResultTransformer{ /**
*
*/
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(SelfResultTransformer.class); public <T> SelfResultTransformer(Class<T> resultClass)
{
super(resultClass);
if(resultClass == null)
{
throw new IllegalArgumentException("resultClass cannot be null");
} else
{
isInitialized = false;
this.resultClass = resultClass;
return;
}
} public boolean isTransformedValueATupleElement(String aliases[], int tupleLength)
{
return false;
} public Object transformTuple(Object tuple[], String aliases[])
{
Object result;
try
{
if(!isInitialized)
initialize(aliases);
else
check(aliases);
result = resultClass.newInstance();
for(int i = 0; i < aliases.length; i++)
if(setters[i] != null)
setters[i].set(result, tuple[i], null); }
catch(InstantiationException e)
{
throw new HibernateException((new StringBuilder()).append("Could not instantiate resultclass: ").append(resultClass.getName()).toString());
}
catch(IllegalAccessException e)
{
throw new HibernateException((new StringBuilder()).append("Could not instantiate resultclass: ").append(resultClass.getName()).toString());
}
return result;
} private void initialize(String aliases[])
{
PropertyAccessor propertyAccessor = new ChainedPropertyAccessor(new PropertyAccessor[] {
PropertyAccessorFactory.getPropertyAccessor(resultClass, null), PropertyAccessorFactory.getPropertyAccessor("field")
});
this.aliases = new String[aliases.length];
setters = new Setter[aliases.length];
for(int i = 0; i < aliases.length; i++)
{
String alias = aliases[i];
if(alias != null)
{
this.aliases[i] = alias;
alias = UnderlineToCamelUtil.underlineToCamel(alias);
try {
setters[i] = propertyAccessor.getSetter(resultClass, alias);
} catch (Exception e) {
logger.warn(resultClass+" property "+alias+" not found");
} }
} isInitialized = true;
} private void check(String aliases[])
{
if(!Arrays.equals(aliases, this.aliases))
throw new IllegalStateException((new StringBuilder()).append("aliases are different from what is cached; aliases=").append(Arrays.asList(aliases)).append(" cached=").append(Arrays.asList(this.aliases)).toString());
else
return;
} public boolean equals(Object o)
{
if(this == o)
return true;
if(o == null || getClass() != o.getClass())
return false;
SelfResultTransformer that = (SelfResultTransformer)o;
if(!resultClass.equals(that.resultClass))
return false;
return Arrays.equals(aliases, that.aliases);
} public int hashCode()
{
int result = resultClass.hashCode();
result = 31 * result + (aliases == null ? 0 : Arrays.hashCode(aliases));
return result;
} private final Class resultClass;
private boolean isInitialized;
private String aliases[];
private Setter setters[]; }
下划线转驼峰工具类,
import java.util.regex.Matcher;
import java.util.regex.Pattern; /**
* @Description :
* @Autor : xiongjinpeng jpx_011@163.com
* @Date : 2016年3月18日 上午10:20:47
* @version :
*/
public class UnderlineToCamelUtil { public static final char UNDERLINE='_';
public static String camelToUnderline(String param){
if (param==null||"".equals(param.trim())){
return "";
}
int len=param.length();
StringBuilder sb=new StringBuilder(len);
for (int i = 0; i < len; i++) {
char c=param.charAt(i);
if (Character.isUpperCase(c)){
sb.append(UNDERLINE);
sb.append(Character.toLowerCase(c));
}else{
sb.append(c);
}
}
return sb.toString();
}
/**
* 下划线转驼峰
* @param param
* @return
*/
public static String underlineToCamel(String param){
if (param==null||"".equals(param.trim())){
return "";
}
int len=param.length();
StringBuilder sb=new StringBuilder(len);
for (int i = 0; i < len; i++) {
char c=param.charAt(i);
if (c==UNDERLINE){
if (++i<len){
sb.append(Character.toUpperCase(param.charAt(i)));
}
}else{
sb.append(c);
}
}
return sb.toString();
}
public static String underlineToCamel2(String param){
if (param==null||"".equals(param.trim())){
return "";
}
StringBuilder sb=new StringBuilder(param);
Matcher mc= Pattern.compile("_").matcher(param);
int i=0;
while (mc.find()){
int position=mc.end()-(i++);
//String.valueOf(Character.toUpperCase(sb.charAt(position)));
sb.replace(position-1,position+1,sb.substring(position,position+1).toUpperCase());
}
return sb.toString();
}
public static void main(String[] args) {
System.out.println(underlineToCamel("a_b_c"));
System.out.println(underlineToCamel2("a_b_c"));
} }
实际调用如下,
private EntityManager em;
public <K> K getObjectBySql(String sql,Object[] params,Class<K> k){
Query query = em.createNativeQuery(sql);
if(params!=null){
for(int i=0,len=params.length;i<len;i++){
Object param=params[i];
query.setParameter(i+1, param);
}
}
query.unwrap(SQLQuery.class).setResultTransformer(new SelfResultTransformer(k));
K object =(K) query.getSingleResult();
return object;
}
jpa中调用的是hibernate中的代码,所以hibernate的sql查询类似
hibernate 或jpa 中使用 AliasToBeanResultTransformer 自定义类型转换ResultTransformer 下划线转驼峰的更多相关文章
- MySql的like语句中的通配符:百分号、下划线和escape
MySql的like语句中的通配符:百分号.下划线和escape %:表示任意个或多个字符.可匹配任意类型和长度的字符. Sql代码 select * from user where user ...
- MySql的like语句中的通配符:百分号、下划线和escape 的使用
MySql的like语句中的通配符:百分号.下划线和escape %代表任意多个字符 select * from user where username like '%huxiao'; select ...
- 如何解决jpa 要求column 名称单词必须用下划线
[转]:http://www.jeesns.cn/article/detail/6657 先引出轮子http://blog.csdn.net/54powerman/article/details/76 ...
- c语言中变量/函数命名以单下划线(_)和双下划线(__) 开头的意义
以单下划线(_)表明是标准库的变量 双下划线(__) 开头表明是编译器的变量 建议自己在命名的时候不要用下划线开头,避免与标准库中的命名冲突 命名方法有好多,何必为自己找不自在呢.
- 【我的Android进阶之旅】如何隐藏Android中EditText控件的默认下划线
Android EditText控件是经常使用的控件,但是有时候我们并不需要它的一些默认的属性,比如说下划线,因为有时候这样的默认下划线看起来特别怪异,和其他控件在一起搭配的时候不协调,因此有时候就需 ...
- mybatis会自动把字段名中的下划线转为驼峰命名法?
先看一下转化的调用堆栈: 代码如下: 上面代码只是去掉了下划线,并没有首字母小写变大写的代码.再跟进findProperty方法可以找到获取驼峰结果的代码如下: 可以看出通过reflector.fin ...
- WPF中的CheckBox的_ (underscore / 下划线)丢失
今天在项目中遇到check box的Content的内容缺少'_', 原因是WPF的ContentPresenter默认会把'_'作为加速键的转义字符. 比方CheckBox的content为&qu ...
- 下划线“_”在oracle中不是单纯的表示下划线的意思,而是表示匹配单一任何字符!
[解决办法]1.使用 escape() 函数escape关键字经常用于使某些特殊字符,如通配符:'%','_'转义为它们原来的字符的意义,被定义的转义字符通常使用'\',但是也可以使用其他的符号.例如 ...
- js中字符串下划线转为驼峰
function camelCase(string){ // Support: IE9-11+ return string.replace( /-([a-z])/g, function( all, l ...
随机推荐
- ajax的两种使用方式
一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待 卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都 ...
- ASP.NET-POSTBACK是什么
当我们直接从服务端读取网页时,表时此网页并没有post(提交),当用户再次提交表单时,就会把此网页的相关参数传给服务器处理,对于服务器来说就是一个postback(提交返回),即提交回来了.这就是po ...
- Bootstrap组件之页头、缩略图
.page-header--指定div元素包裹页头组件. <div class="page-header"> <h1>小镇菇凉<small> 2 ...
- Raspberry PI 系列 —— 裸机点亮LED灯
Raspberry PI 系列 -- 裸机点亮LED灯 背景 近期刚买了Raspberry PI B+,配置执行了官方提供的Raspbian系统,折腾了一周Linux系统,感觉没啥意思,于是就试着想了 ...
- 怎样在Nginxserver中启用Gzip压缩
原文链接: Enable GZIP Compression on nginx Servers原文日期: 2014年7月16日翻译日期: 2014年7月19日翻译人员: 铁锚 速度决定一切,没有什么比一 ...
- myeclipse配置内存
1.javaee项目假设耗费的内存过大,须要配置内存大小: 下图是配置tomcat结果:Optional program arguments: -Xms512M -Xmx512M -XX:PermSi ...
- 移动端fixed后 横竖屏切换时上部或下部出现空隙问题
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 最长公共子序列(稀疏序列)nlogn解法
首先这种做法只能针对稀疏序列, 比如这种情况: abc abacabc. 会输出5 ,,,,就比较尴尬, #include<iostream> #include<cstdio> ...
- 让placeholder中的默认文字居中,或者缩进多少像素
直接给input或者textarea的样式加texta-align:center; <input type="" name="" id="&qu ...
- Android RecyclerView 设置item间隔的方法
RecyclerView大家常用,但是如何给加载出来的item增加间隔很多人都不知道,下面是方法,直接上代码了: LinearLayoutManager layoutManager = new Lin ...