【问题标题】:JAVA Eclipselink queryJAVA Eclipselink 查询
【发布时间】:2019-05-29 20:24:34
【问题描述】:

我正在尝试编写一个具有 3 个条件 where 语句的 JPA 查询。但我似乎没有得到正确的语法。

try {
    Query findCustomerQuery = entityManager.createQuery("SELECT c FROM Customer c WHERE " +
            "CASE " +
            "WHEN :customerNumber is not null THEN (c.customerNumber = :customerNumber)" +
            "WHEN :customerName is not null THEN (c.name = :customerName) " +
            "WHEN :customerFirstname is not NULL THEN (c.firstName = :customerFirstname) ELSE (c.customerNumber = 0) END");

    findCustomerQuery.setParameter("customerNumber",customerNumber);
    findCustomerQuery.setParameter("customerName", customerName);
    findCustomerQuery.setParameter("customerFirstname", customerFirstname);
    return (Customer) findCustomerQuery.getSingleResult();

}finally {
    entityManager.close();
}

【问题讨论】:

  • 在哪里? CASE 用于 SELECT 而不是 WHERE

标签: java jpa eclipselink


【解决方案1】:

在这些情况下使用 JPA Criteria API 很方便。

这是您的案例的示例:

// get a query builder
CriteriaBuilder builder = em.getCriteriaBuilder();
// build query for entity
CriteriaQuery<Customer> criteriaQuery = builder.createQuery( Customer.class );
// set FROM entity
Root<Customer> tags = criteriaQuery.from( Customer.class );
// get a basic predicate
Predicate p = builder.and();
// add WHERE conditions properly
if (customerNumber != null) {
    Predicate conditionPredicate = builder.and(
            builder.equal( tags.get("customerNumber"), customerNumber )
    );
    p = builder.and(p, conditionPredicate);
}
// do the same for customerName and customerFirstName
if (customerName != null) {
    Predicate conditionPredicate = builder.and(
            builder.equal( tags.get("customerName"), customerName )
    );
    p = builder.and(p, conditionPredicate);
}
if (customerFirstName != null) {
    Predicate conditionPredicate = builder.and(
            builder.equal( tags.get("customerFirstName"), customerFirstName )
    );
    p = builder.and(p, conditionPredicate);
}

// set predicate to query
criteriaQuery.where( p );

// call query and get results
TypedQuery<Customer> q = em.createQuery(criteriaQuery);
List<Customer> o = q.getResultList();

如果您需要,这里是more examples

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 2019-01-26
    • 2014-02-19
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多