繁体   English   中英

JPA CriteriaBuilder 和子字符串

[英]JPA CriteriaBuilder and Substring

我有一个 CriteriaBuilder,我试图在其中获取从 0 到 10 的字符。但是我无法获得所需的输出。

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Emp> cq = cb.createQuery(Emp.class);
    Root<Emp> c = cq.from(Emp.class);
    cb.substring(c.<String>get("projDesc"), 0, 10);
    cq.orderBy(cb.desc(c.get("salary")));
    Query query = em.createQuery(cq);
    .....

这可能是什么原因?

javadoc

创建用于子字符串提取的表达式。 从指定位置开始提取给定长度的子字符串。 第一名是1。

尝试做cb.substring(c.<String>get("projDesc"), 1, 10);


我认为您忘记选择Expression<E>

尝试cq.select(cb.substring(c.<String>get("projDesc"), 1, 10))如果需要返回Emp ,它将返回List<String>

cb.construct(Emp.class, e.get("prop1"), e.get("prop2"), cb.substring(c.<String>get("projDesc"), 1, 10)));

我也遇到了同样的问题,我必须对前三个字符进行子串化并从数字 107 开始获取所有帐户。 为此,我使用了CriteriaBuildersubstring方法,如下所示。

Predicate accountNumber = criteriaBuilder.equal(criteriaBuilder.substring(from.get("accountNumber").as(String.class), 0, 3), cwipAcc);

但不幸的是,它不适用于CriteriaBuildersubstring 所以我使用类似查询通过下面给出的代码来解决这个问题。

Predicate accountNumber = criteriaBuilder.like(from.get("accountNumber").as(String.class), String.valueOf(cwipAcc) + "%");

在这里,我刚刚获取了从 107 开始的所有记录,依此类推。

例子:

public List<GLCharts> findAccountForCWIP(Long cwipAcc, Long glInfo) {
        Map<String, Object> data = new HashMap();
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<GLCharts> criteriaQuery = criteriaBuilder.createQuery(GLCharts.class);
        Root<GLCharts> from = criteriaQuery.from(GLCharts.class);

        Predicate accountNumber = criteriaBuilder.like(from.get("accountNumber").as(String.class), String.valueOf(cwipAcc) + "%");
        Predicate glCompanyInfo = criteriaBuilder.equal(from.join("gLCompanyInfo").get("id"), glInfo);

        Predicate finalPredicate = criteriaBuilder.and(accountNumber, glCompanyInfo);

        criteriaQuery.select(from).where(finalPredicate).orderBy(Stream.of(criteriaBuilder.asc(from.get("accountNumber"))).collect(Collectors.toList()));
        List<GLCharts> glChartsList = entityManager.createQuery(criteriaQuery).getResultList();

        return glChartsList;
    }

我遇到了这个问题,因为我的要求是在substr中使用数字。 以下是示例代码。

 @Override
    public List<SampleProfile> findNonSampleProfileBySequence(Long SampleNo) {
        List<SampleProfile> profiles = new ArrayList<>();
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<SampleProfile> criteriaQuery = criteriaBuilder.createQuery(SampleProfile.class);
        Root<SampleProfile> SampleProfileRoot = criteriaQuery.from(SampleProfile.class);
        List<Predicate> predicates = new ArrayList<Predicate>();
        if (SampleUtil.isValidLong(SampleNo)) {
            String SampleStr = Long.toString(SampleNo);
            if (StringUtils.isNotBlank(SampleStr) && SampleStr.length() > 5) {
                String SampleSequence = SampleStr.substring(5);
                predicates.add(criteriaBuilder.equal(criteriaBuilder.substring(SampleProfileRoot.get(SampleProfile_.id).as(String.class), 6), SampleSequence));
                predicates.add(criteriaBuilder.equal(SampleProfileRoot.get(SampleProfile_.address).get(Address_.department), SampleStr.substring(0,3)));
            }
        }
        if (!CollectionUtils.isEmpty(predicates)) {
            criteriaQuery.where(criteriaBuilder.and(Iterables.toArray(predicates, Predicate.class)));
            profiles = entityManager.createQuery(criteriaQuery).setMaxResults(AbstractJpaDAO.MAX_ROW_LIMIT).getResultList();
        }
        return profiles;
    }

还要注意,为了提高性能,您必须在同一索引上创建索引。 Cast关键字很重要,因为Hibernate方言将像这样创建查询,因此它必须与您的索引匹配。

CREATE INDEX MY_SCHEMA_OWNER.IDX_SUBSTR_SMP_CODE ON MY_SCHEMA_OWNER.SMP_PROFILE (SUBSTR(**CAST**(SMP_CODE AS VARCHAR2(255 CHAR)),6));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM