Java JPQL中的FindByExample
我已经决定在我的抽象DAO中编写一个通用的findByExample方法 我的结果是:Java JPQL中的FindByExample,java,jpa,reflection,jpql,Java,Jpa,Reflection,Jpql,我已经决定在我的抽象DAO中编写一个通用的findByExample方法 我的结果是: public List<T> findByExample(T example) throws DAOException { try { Object object = example; String query = "SELECT e from " + object.getClass().getName() + " e where 1 = 1";
public List<T> findByExample(T example) throws DAOException {
try {
Object object = example;
String query = "SELECT e from " + object.getClass().getName() + " e where 1 = 1";
for (Field field : object.getClass().getDeclaredFields()) {
Object fieldValue;
field.setAccessible(true);
if (field.get(object) instanceof List || (java.lang.reflect.Modifier.isStatic(field.getModifiers()))) {
continue;
} else {
fieldValue = field.get(object);
if (fieldValue != null) {
if((fieldValue instanceof String) && !((String)fieldValue).isEmpty())
{
query += " and e." + field.getName() + " LIKE :" + field.getName();
}
else
query += " and e." + field.getName() + " = :" + field.getName();
}
}
}
Query q = em.createQuery(query, object.getClass());
for (Field field : object.getClass().getDeclaredFields()) {
Object fieldValue;
field.setAccessible(true);
if (field.get(object) instanceof List || (java.lang.reflect.Modifier.isStatic(field.getModifiers()))) {
continue;
} else {
fieldValue = field.get(object);
if (fieldValue != null) {
if((fieldValue instanceof String) && !((String)fieldValue).isEmpty())
{
q.setParameter(field.getName(), "%" + field.get(object) + "%");
}
else
q.setParameter(field.getName(), field.get(object));
}
}
}
return q.getResultList();
} catch (SecurityException | IllegalArgumentException | IllegalAccessException e) {
throw new DAOException("", e);
}
}
public List findByExample(T示例)引发异常{
试一试{
对象=示例;
String query=“从“+object.getClass().getName()+”e中选择e,其中1=1”;
对于(字段:object.getClass().getDeclaredFields()){
对象字段值;
字段。setAccessible(true);
if(field.get(object)instanceof List | |(java.lang.reflect.Modifier.isStatic(field.getModifiers())){
继续;
}否则{
fieldValue=field.get(对象);
如果(字段值!=null){
如果((字符串的字段值实例)和((字符串)字段值).isEmpty())
{
查询+=”和e.“+field.getName()+”类似:“+field.getName()”;
}
其他的
查询+=”和e.“+field.getName()+”=:“+field.getName();
}
}
}
Query q=em.createQuery(Query,object.getClass());
对于(字段:object.getClass().getDeclaredFields()){
对象字段值;
字段。setAccessible(true);
if(field.get(object)instanceof List | |(java.lang.reflect.Modifier.isStatic(field.getModifiers())){
继续;
}否则{
fieldValue=field.get(对象);
如果(字段值!=null){
如果((字符串的字段值实例)和((字符串)字段值).isEmpty())
{
q、 setParameter(field.getName(),“%”+field.get(object)+“%”;
}
其他的
q、 setParameter(field.getName(),field.get(object));
}
}
}
返回q.getResultList();
}捕获(SecurityException | IllegalArgumentException | IllegalAccessException e){
抛出新的异常(“,e);
}
}
我写这篇文章的时候有以下假设:
另外,如果您看到任何bug或类似的东西,请告诉我。我解决此问题的最终版本代码如下,我希望它也能帮助您
public List<T> findByExample(T example, Map<String, SortOrder> sortMap, int startIndex, int pageSize) throws DAOException {
try {
Object object = example;
String query = "SELECT e from " + object.getClass().getName() + " e where 1 = 1";
if(!(object instanceof BaseEntity))
{
throw new DAOException(null, null);
}
Field[] fields = object.getClass().getDeclaredFields();
for (Field field : fields) {
Object fieldValue;
field.setAccessible(true);
if (field.get(object) instanceof List || (java.lang.reflect.Modifier.isStatic(field.getModifiers())) || field.getName().startsWith("_")) {
continue;
} else {
fieldValue = field.get(object);
if (fieldValue != null) {
if ((fieldValue instanceof String) && !((String) fieldValue).isEmpty()) {
query += " and e." + field.getName() + " LIKE :" + field.getName();
} else {
query += " and e." + field.getName() + " = :" + field.getName();
}
}
}
}
if(sortMap != null && !sortMap.isEmpty())
{
for(Entry<String, SortOrder> entry : sortMap.entrySet())
{
query += " ORDER BY e." + entry.getKey() + " " + entry.getValue().name();
}
}
Query q = em.createQuery(query, object.getClass());
for (Field field : fields) {
Object fieldValue;
field.setAccessible(true);
if (field.get(object) instanceof List || (java.lang.reflect.Modifier.isStatic(field.getModifiers())) || field.getName().startsWith("_")) {
continue;
} else {
fieldValue = field.get(object);
if (fieldValue != null) {
if ((fieldValue instanceof String) && !((String) fieldValue).isEmpty()) {
q.setParameter(field.getName(), "%" + field.get(object) + "%");
} else {
q.setParameter(field.getName(), field.get(object));
}
}
}
}
return q.setFirstResult(startIndex).setMaxResults(pageSize).getResultList();
} catch (SecurityException | IllegalArgumentException | IllegalAccessException e) {
throw new DAOException(null, e);
}
}
public List findByExample(T示例,Map sortMap,int startIndex,int pageSize)抛出异常{
试一试{
对象=示例;
String query=“从“+object.getClass().getName()+”e中选择e,其中1=1”;
if(!(BaseEntity的对象实例))
{
抛出新的异常(null,null);
}
Field[]fields=object.getClass().getDeclaredFields();
用于(字段:字段){
对象字段值;
字段。setAccessible(true);
if(field.get(object)instanceof List | | |(java.lang.reflect.Modifier.isStatic(field.getModifiers())| | field.getName().startsWith(“|”)){
继续;
}否则{
fieldValue=field.get(对象);
如果(字段值!=null){
如果((字符串的字段值实例)和((字符串)字段值).isEmpty()){
查询+=”和e.“+field.getName()+”类似:“+field.getName()”;
}否则{
查询+=”和e.“+field.getName()+”=:“+field.getName();
}
}
}
}
if(sortMap!=null&&!sortMap.isEmpty())
{
for(条目:sortMap.entrySet())
{
query++=“按e.排序”+entry.getKey()+“”+entry.getValue().name();
}
}
Query q=em.createQuery(Query,object.getClass());
用于(字段:字段){
对象字段值;
字段。setAccessible(true);
if(field.get(object)instanceof List | | |(java.lang.reflect.Modifier.isStatic(field.getModifiers())| | field.getName().startsWith(“|”)){
继续;
}否则{
fieldValue=field.get(对象);
如果(字段值!=null){
如果((字符串的字段值实例)和((字符串)字段值).isEmpty()){
q、 setParameter(field.getName(),“%”+field.get(object)+“%”;
}否则{
q、 setParameter(field.getName(),field.get(object));
}
}
}
}
返回q.setFirstResult(startIndex).setMaxResults(pageSize).getResultList();
}捕获(SecurityException | IllegalArgumentException | IllegalAccessException e){
抛出新的异常(null,e);
}
}
Nice,我在一年前写过类似的东西,但使用标准APIConsider将其移至“代码审查”。