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 ...
随机推荐
- 读取bin文件,并且按结构体赋值打印
目标:读取一个bin文件,并且将bin文件中的数据,按字节对齐赋值给结构体,并且打印出结构体的内容 目前思路是简单的先将bin文件数据一次性读到一个数组中,再将数组强制转换为结构体 ] FILE *f ...
- ACCESS-入门思维导图
ACCESS-入门思维导图 链接:http://pan.baidu.com/s/1bozYiNt 密码:5tly 如果有错误,请告知我!
- 洛谷 P1518 两只塔姆沃斯牛 The Tamworth Two
P1518 两只塔姆沃斯牛 The Tamworth Two 题目背景 题目描述 两只牛逃跑到了森林里.农夫John开始用他的专家技术追捕这两头牛.你的任务是模拟他们的行为(牛和John). 追击在1 ...
- AIX查看某个端口被哪个进程占用
AIX查看某个端口被哪个进程占用 学习了:https://zhidao.baidu.com/question/1928716757722021467.html 1. netstat -Aan|grep ...
- sqlplus登录提示:ORA-12162:TNS:net service name is incorrectly specified错误
[root@localhost ~]# su - oracle [oracle@localhost ~]$ sqlplus '/as sysdba' SQL*Plus: Release 11.2.0. ...
- 【LDA】动手实现LDA
这段时间对LDA比較感兴趣,尝试在工作中使用它.平时做想法的高速验证,都用的是"GibbsLDA++-0.2",一个c实现版本号的LDA. 这两天用c++ stl自己写了一个单机版 ...
- [jzoj 5930] [NOIP2018模拟10.26】山花 解题报告 (质因数分类)
题目链接: http://172.16.0.132/senior/#contest/show/2538/2 题目: 小S决定从某一个节点$u$开始对其子树中与$u$距离小于$K$的节点代表的花树进行采 ...
- webpack的像素转vw loader插件
这是一款针对webpack的像素转vw单位的loader插件. 笔者公司中,h5 rem的开发方案目前已经渐渐开始转向vw方案,因此本工具应运而生. 目前所制作的h5,大部分设计稿分辨率都是750的宽 ...
- Android 对话框黑色边框的解决
代码解决 : Dialog dialog = new Dialog(this); Window win = dialog.getWindow(); win.setBackgroundDrawableR ...
- (转载)15 个 Android 通用流行框架大全
15 个 Android 通用流行框架大全 时间:2017-03-20 11:36来源:未知 作者:admin 点击: 2089 次 15 个 Android 通用流行框架大全 1. 缓存 Dis ...