Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPQL中的FindByExample_Java_Jpa_Reflection_Jpql - Fatal编程技术网

Java JPQL中的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";

我已经决定在我的抽象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";
        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将其移至“代码审查”。