java - 如何正确将此 SQL case 语句转换为 JPA Criteria 查询

标签 java mysql jpa

我有一个实体,如下所示;

@Entity
@Table(name="cashhistory")  
@NamedQueries({
    @NamedQuery(name="CashHistory.findAll", query="SELECT c FROM CashHistory c")
})

public class CashHistory implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(unique=true, nullable=false)
    private int id;

    @Column(nullable=false)
    private boolean funded;

    //... other fields
    //... getters & setters...
}

我需要相当于以下 MySQL 查询的 JPA Criteria

select * from cashhistory c 
where (case when (c.funded = true) then 'SUCCESS' else 'FAILED' end) like '%SUCC%'

所以我制作了一个像这样的 JPA Criteria API 表达式;

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<CashHistory> cq = cb.createQuery(CashHistory.class);
Root<CashHistory> entity = cq.from(CashHistory.class);
cq.select(entity);

Expression<String> expr = cb.selectCase()
    .when(cb.equal(entity.<Boolean>get("funded"), cb.literal(true)), cb.literal("SUCCESS"))
    .otherwise(cb.literal("FAILED")).as(String.class);

cq.where(cb.like(expr, "%SUCC%"));
TypedQuery<CashHistory> query = em.createQuery(cq);
return query.getResultList();

但它在这一行抛出以下异常 TypedQuery<CashHistory> query = em.createQuery(cq); 。请参阅下面的 StackTrace;

Caused by: java.lang.IllegalArgumentException: Parameter value [%SUCC%] did not match expected type [java.lang.Character]
    at org.hibernate.ejb.AbstractQueryImpl.validateParameterBinding(AbstractQueryImpl.java:370) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding(AbstractQueryImpl.java:343) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:370) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.criteria.CriteriaQueryCompiler$1$1.bind(CriteriaQueryCompiler.java:194) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.criteria.CriteriaQueryCompiler.compile(CriteriaQueryCompiler.java:247) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:622) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.jboss.as.jpa.container.AbstractEntityManager.createQuery(AbstractEntityManager.java:96) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]

有人可以指出我可能做错了什么吗?

最佳答案

您是否在 Hibernate 中看到过此问题? ?

我也尝试了你的代码,看起来它不适用于字符串类型的 selectCase,而是使用 Integer 作为解决方法。

像这样的代码应该可以工作:

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<CashHistory> cq = cb.createQuery(CashHistory.class);
    Root<CashHistory> entity = cq.from(CashHistory.class);
    cq.select(entity);

    Expression<Integer> caseExpr = cb.selectCase()
            .when(cb.equal(entity.get("funded"), true), 1)
            .otherwise(2).as(Integer.class);


    cq.where(cb.equal(caseExpr, 1));
    TypedQuery<CashHistory> query = em.createQuery(cq);
    query.getResultList();

关于java - 如何正确将此 SQL case 语句转换为 JPA Criteria 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33176935/

相关文章:

java - Gradle 在依赖解析期间更改分类器

java - 如何阻止生产者接收发送到主题的消息?

java - Hibernate JPA 持久保存父 ID 为空的子实体

java - 无法从任何地方构建 Hibernate SessionFactory 异常

java - JPA继承查询(Eclipse Link)

Java Enums : Two enum types, 每个都包含对彼此的引用?

java - 如何使用 Eclipse 模板自动插入类表示法?

php - Fuelphp 石油生成脚手架与字段 : primary key not null auto-increment

mysql - 如何正确加入这 4 个表格 View

mysql - 从没有主键的表迁移到有主键的表