【问题标题】:Hibernate/JPA generating a query without alias for subqueryHibernate/JPA 为子查询生成没有别名的查询
【发布时间】:2018-11-01 21:22:31
【问题描述】:

我有下面这个生成动态 Hibernate/JPA 查询的类(由于参数的动态性质):

      import java.util.ArrayList;
      import java.util.List;
     import java.util.Map;

   import javax.persistence.EntityManager;
   import javax.persistence.PersistenceContext;
   import javax.persistence.Query;

    import org.apache.commons.lang3.StringUtils;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Repository;

        import com.charter.egateway.datalayer.model.AccountDatabase;

        @Repository
        public class AccountRepositoryCustomImpl implements AccountRepositoryCustom 
       {

        @PersistenceContext
        private EntityManager em;

        @Value("${recordLimit}")
        private String recordLimit;

        @Override
        public List<AccountDatabase> searchForAccounts(Map<String, Object> map) {

            boolean hasPassedParameters = false;
            List<String> whereClause = new ArrayList<>();

            StringBuilder queryBuilder = new StringBuilder();
            queryBuilder.append("select ad from AccountDatabase ad ");

            for (String key : map.keySet()) {
                if (!key.equals("city") && !key.equalsIgnoreCase("address")
                        && !key.equalsIgnoreCase("billingAccountNumber")) {

                    if (key.equals("accountType")) {
                        whereClause.add(" ad." + key + " = :" + key);
                    } else {
                        whereClause.add(" UPPER(ad." + key + ") LIKE :" + key);

                    }
                    hasPassedParameters = true;
                }
            }

            queryBuilder.append(" where " + StringUtils.join(whereClause, " and "));

            if (map.containsKey("city")) {
                if (hasPassedParameters) {
                    queryBuilder.append(" AND ");
                }
                queryBuilder.append(" (( ad.accountType LIKE :accountType AND UPPER(ad.billingCity) LIKE :billingCity ) OR "
                        + "( ad.accountType LIKE :accountType2 AND UPPER(ad.shippingCity) LIKE :shippingCity )) ");

                hasPassedParameters = true;

            }

            if (map.containsKey("address")) {
                if (hasPassedParameters) {
                    queryBuilder.append(" AND ");
                }
                queryBuilder
                        .append(" (( ad.accountType LIKE :accountType AND UPPER(ad.billingStreet) LIKE :billingStreet ) OR "
                                + "( ad.accountType LIKE :accountType2 AND UPPER(ad.shippingStreet) LIKE :shippingStreet )) ");

                hasPassedParameters = true;

            }

            if (map.containsKey("billingAccountNumber")) {
                if (hasPassedParameters) {
                    queryBuilder.append(" AND ");
                }
                queryBuilder
                        .append(" (( ad.accountType LIKE :accountType AND ad.billingAccountNumber LIKE :billingAccountNumber ) OR "
                                + "( ad.accountType LIKE :accountType2 AND ad.billingAccountNumberForServiceLocation LIKE :billingAccountNumberForServiceLocation )) ");

            }



            Query jpaQuery = em.createQuery(queryBuilder.toString(), AccountDatabase.class);    

            //Query jpaQuery = em.createQuery(queryBuilder.toString(), AccountDatabase.class);

            for (String key : map.keySet()) {
                if (!key.equals("city") && !key.equalsIgnoreCase("address")
                        && !key.equalsIgnoreCase("billingAccountNumber")) {

                    if (key.equals("accountType")) {
                        jpaQuery.setParameter(key, map.get(key));
                    } else {
                        jpaQuery.setParameter(key, "%" + String.valueOf(map.get(key)).toUpperCase() + "%");
                    }
                }
            }

            if (map.containsKey("address")) {
                if (map.containsKey("accountType")) {

                    jpaQuery.setParameter("accountType", map.get("accountType"));
                    jpaQuery.setParameter("accountType2", map.get("accountType"));
                } else {
                    jpaQuery.setParameter("accountType", "Billing Account");
                    jpaQuery.setParameter("accountType2", "Service Location");

                }
                jpaQuery.setParameter("billingStreet", "%" + String.valueOf(map.get("address")).toUpperCase() + "%");
                jpaQuery.setParameter("shippingStreet", "%" + String.valueOf(map.get("address")).toUpperCase() + "%");
            }

            if (map.containsKey("city")) {
                if (map.containsKey("accountType")) {
                    jpaQuery.setParameter("accountType", map.get("accountType"));
                    jpaQuery.setParameter("accountType2", map.get("accountType"));
                } else {
                    jpaQuery.setParameter("accountType", "Billing Account");
                    jpaQuery.setParameter("accountType2", "Service Location");

                }
                jpaQuery.setParameter("billingCity", "%" + String.valueOf(map.get("city")).toUpperCase() + "%");
                jpaQuery.setParameter("shippingCity", "%" + String.valueOf(map.get("city")).toUpperCase() + "%");
            }

            if (map.containsKey("billingAccountNumber")) {
                if (map.containsKey("accountType")) {
                    jpaQuery.setParameter("accountType", map.get("accountType"));
                    jpaQuery.setParameter("accountType2", map.get("accountType"));
                } else {
                    jpaQuery.setParameter("accountType", "Billing Account");
                    jpaQuery.setParameter("accountType2", "Service Location");

                }

                jpaQuery.setParameter("billingAccountNumber", "%" + map.get("billingAccountNumber") + "%");
                jpaQuery.setParameter("billingAccountNumberForServiceLocation",
                        "%" + map.get("billingAccountNumber") + "%");
            }

            int limit = Integer.valueOf(recordLimit);



            //TypedQuery<AccountDatabase> query = em.createQuery(queryBuilder.toString(), AccountDatabase.class);    

            //List<AccountDatabase> list = jpaQuery.getResultList();

            jpaQuery.setMaxResults(limit);
            List<AccountDatabase> list = jpaQuery.getResultList();
            if (list.size() > limit) {
                list = list.subList(0, limit);
            }

            em.close();
            return list;

        }

    }

如果不使用本机查询,我该怎么办?如何让它发挥作用?

Table subquery missing an alias.  On line 1, column 734.  [parser-2909810]

BlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablablaBlablabla

【问题讨论】:

    标签: hibernate jpa jpa-2.0


    【解决方案1】:

    我最近遇到了这个问题,并在hibernate中将问题追溯到this change。

    为了解决这个问题,我编写了以下自定义方言,它基本上恢复了该更改:

    import org.hibernate.dialect.Oracle12cDialect;
    import org.hibernate.dialect.pagination.LimitHandler;
    import org.hibernate.dialect.pagination.SQL2008StandardLimitHandler;
    
    public class CustomDialect extends Oracle12cDialect {
    
        @Override
        public LimitHandler getLimitHandler() {
            return SQL2008StandardLimitHandler.INSTANCE;
        }
    
    }
    

    或者,使用版本 5.3.3.Final 也应该可以解决您的问题,因为这是此更改之前的最后一个版本。如果使用 Maven,则如下所示:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.3.3.Final</version>
    </dependency>
    

    我很好奇您是否连接到 Tibco/(以前是 Cisco)数据虚拟化平台。

    【讨论】:

      猜你喜欢
      • 2021-03-07
      • 1970-01-01
      • 2011-01-23
      • 2016-04-18
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      相关资源
      最近更新 更多