java - 在 jpa 标准中, "in case there is at least 1 row return true"

标签 java sql database jpa criteria-api

我正在尝试使用 JPA (eclipselink) 中的标准 api 创建以下句子, 很简单,询问某个类别中是否存在某个用户

我想要的句子:

SELECT 
  CASE 
     WHEN EXISTS
          (SELECT * FROM user WHERE category = ?)
     THEN true
     ELSE false
  END 
bind => [10]

我尝试使用这段代码:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Boolean> criteriaQuery = criteriaBuilder.createQuery(Boolean.class);
Root<T> root = criteriaQuery.from(tclass);

Subquery<T> subquery = criteriaQuery.subquery(tclass);
Root<T> subroot = subquery.from(tclass);
subquery.select(subroot);

Predicate subPredicate = criteriaBuilder.equal(subroot.get("category"),category);
subquery.where(subPredicate);

Predicate predicateExists = criteriaBuilder.exists(subquery);

Case<Boolean> booleancase = criteriaBuilder.<Boolean>selectCase();
Expression<Boolean> booleanExpression =
    booleancase.when(predicateExists,true)
    .otherwise(false);

criteriaQuery.select(booleanExpression);

TypedQuery<Boolean> typedQuery = entityManager.createQuery(criteriaQuery);
typedQuery.getResultList();

可悲的是,我的句子如下,我想删除最后一个“来自用户”:

SELECT 
  CASE 
      WHEN EXISTS
          (SELECT ? FROM user t1 WHERE (t1.category = ?))  
     THEN ?
     ELSE ? 
  END
FROM user t0    
bind => [1, 110, true, false]

有什么想法吗?

最佳答案

遗憾的是,JPA 不支持选择没有实体(表)的数据。甚至标准的 SQL92 都不支持这一点——看看如何在不同数据库中没有表的情况下进行选择:http://en.wikibooks.org/wiki/SQL_Dialects_Reference/Select_queries/Select_without_tables

在 SQL92 标准中,您必须在 SELECT 子句中提供表。

JPA 也是一个被广泛接受的标准,通常不提供非标准功能,甚至许多标准 SQL 功能也只出现在最新版本的 JPA 中(例如,嵌套选择最近才出现在 JavaEE 7 中的 JPA 2.1 中)。

因此解决方案是从某个实体中进行选择,该实体在数据库中始终至少有一行,并通过 query.setMaxResults(1) 将结果限制为最大 1。更好的是创建一个虚拟实体,它总是有 1 行并且它的内容永远不会改变。这将提高选择的性能。

关于java - 在 jpa 标准中, "in case there is at least 1 row return true",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16996191/

相关文章:

java - 如何以多线程方式调用不同类的相同方法

sql - 为什么不能对文本使用 COUNT() 方法?

mysql - 为什么我的 MySQL 查询在我这样做时很快,而在我这样做时却很慢?

java - java中读取文件的问题

java - 检测点击的卡片

java - 如何使用 Spring Boot 将生成的 PDF 文件保存到 MySQL 数据库?

sql - 如何在 SQL Server 2008 R2 中获取/设置日期范围中间的值

mysql - Mysql中的锁问题。我需要从我获取锁的表中读取数据

database - Play! 中的 SSL 连接框架

mysql - 在MYSQL中查找具有不同拼写的重复记录