Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java持久性查询语言仅获取子查询中的前n行_Java_Jpa_Db2_Jpql - Fatal编程技术网

使用Java持久性查询语言仅获取子查询中的前n行

使用Java持久性查询语言仅获取子查询中的前n行,java,jpa,db2,jpql,Java,Jpa,Db2,Jpql,我正在尝试使用Java持久性查询语言对DB2表进行批量更新: UPDATE Account a SET a.Status = 'r', a.Code = :code, a.Timestamp = CURRENT_TIMESTAMP WHERE ClientNumber IN (SELECT ClientNumber FROM Account WHERE a.Status = '' AND a.Type = :type

我正在尝试使用Java持久性查询语言对DB2表进行批量更新:

UPDATE Account  a
SET a.Status = 'r', a.Code = :code, a.Timestamp = CURRENT_TIMESTAMP
WHERE ClientNumber IN  (SELECT ClientNumber FROM Account
                        WHERE a.Status = '' AND a.Type = :type 
                        ORDER BY a.Code ASC
                        FETCH FIRST 5 ROWS ONLY)
但是,JPQL中似乎不支持仅获取前n行


还有什么其他方法可以做到这一点呢?

在JPQL中无法执行这样的查询。您必须使用SQL

也可以执行以下查询:

SELECT a FROM Account a WHERE a.Status = '' AND a.Type = :type
并在执行查询之前调用
setMaxResults(5)
。因此,您将获得5个帐户(最多),您可以更改5个返回帐户的状态、代码和时间戳


我觉得很奇怪,查询的前5行没有任何
order by
子句。

在JPQL中无法执行这样的查询。您必须使用SQL

也可以执行以下查询:

SELECT a FROM Account a WHERE a.Status = '' AND a.Type = :type
并在执行查询之前调用
setMaxResults(5)
。因此,您将获得5个帐户(最多),您可以更改5个返回帐户的状态、代码和时间戳


但是,我发现很奇怪,查询的前5行没有任何
order by
子句。

出现了什么错误?对于大型机DB2,子查询中的
FETCH FIRST
仅在9.1之后才出现过(但如果您使用的是比这更老的版本,那么现在已经不受支持了),我相信它已经在Linux/Unix/Windows中出现了一段时间。我看到的一个快速错误是,您在
:code
之后,在
A.Timestamp
@galdor之前缺少一个逗号。数据库肯定支持它。。。我得到的错误是org.apache.openjpa.persistence.ArgumentException和sas@JBNizet提到的保留字列表,您的
ORDER BY
子句在哪里?即使这样做可行,你也会得到5个随机行,这不是你想要的。记住,SQL本质上是无序的,你必须告诉它你想要什么。实际上,子查询中的条件应该包含在main
WHERE
子句中,以防止更新虚行(取决于锁级别)。另外,如果您只更新5行,那么这是一个“批量更新”吗?如果因为事务而对其进行批处理,请使用更大的行数。@X-Zero 5行只是一个简单的示例,我实际上需要随机帐户设置随机行是一个完全不同的用例。一方面,您不会得到足够多的随机行(因为它们将根据某个索引排序,通常,您无法选择哪一个)。生成一些随机的
ClientNumber
s应用程序端,并对其运行更新。您得到的错误是什么?对于大型机DB2,子查询中的
FETCH FIRST
仅在9.1之后才出现过(但如果您使用的是比这更老的版本,那么现在已经不受支持了),我相信它已经在Linux/Unix/Windows中出现了一段时间。我看到的一个快速错误是,您在
:code
之后,在
A.Timestamp
@galdor之前缺少一个逗号。数据库肯定支持它。。。我得到的错误是org.apache.openjpa.persistence.ArgumentException和sas@JBNizet提到的保留字列表,您的
ORDER BY
子句在哪里?即使这样做可行,你也会得到5个随机行,这不是你想要的。记住,SQL本质上是无序的,你必须告诉它你想要什么。实际上,子查询中的条件应该包含在main
WHERE
子句中,以防止更新虚行(取决于锁级别)。另外,如果您只更新5行,那么这是一个“批量更新”吗?如果因为事务而对其进行批处理,请使用更大的行数。@X-Zero 5行只是一个简单的示例,我实际上需要随机帐户设置随机行是一个完全不同的用例。一方面,您不会得到足够多的随机行(因为它们将根据某个索引排序,通常,您无法选择哪一个)。生成一些随机的
ClientNumber
s应用程序端,并对其运行更新。根据实体的数量和实体的当前状态,将有1个选择查询和0到5个更新查询。JPA引擎可以将5个更新放在一个批次中。这是修改一小部分实体的典型方式。根据实体的数量和实体的当前状态,将有1个选择查询和0到5个更新查询。JPA引擎可以将5个更新放在一个批次中。这是修改一小部分实体的典型方式。