Sql server 从大型表上的JPQL查询中获取随机结果

Sql server 从大型表上的JPQL查询中获取随机结果,sql-server,jpa,jpql,Sql Server,Jpa,Jpql,我目前正在使用JPQL查询从数据库检索信息。该项目的目的是通过不同元素的随机性来测试样本环境,因此我需要查询来检索整个项目中的随机单一结果 我面临的问题是,JPQL没有实现用于随机检索的适当函数,随机后计算花费了太长的14秒,附加函数无法返回随机结果 public Player getRandomActivePlayerWithTransactions(){ List<Player> randomPlayers = entityManager.createQuery

我目前正在使用JPQL查询从数据库检索信息。该项目的目的是通过不同元素的随机性来测试样本环境,因此我需要查询来检索整个项目中的随机单一结果

我面临的问题是,JPQL没有实现用于随机检索的适当函数,随机后计算花费了太长的14秒,附加函数无法返回随机结果

public Player getRandomActivePlayerWithTransactions(){

        List<Player> randomPlayers = entityManager.createQuery("SELECT pw.playerId FROM PlayerWallet pw JOIN pw.playerId p"
                + " JOIN p.gameAccountCollection ga JOIN ga.iDAccountStatus acs"
                + " WHERE (SELECT count(col.playerWalletTransactionId) FROM pw.playerWalletTransactionCollection col) > 0 AND acs.code = :status")
                .setParameter("status", "ACTIVATED")
                .getResultList();

        return randomPlayers.get(random.nextInt(randomPlayers.size()));
    }
由于JPQL限制,不允许按NEWID排序,因此我测试了以下内联条件,所有这些条件在编译时都返回了语法错误

WHERE (ABS(CAST((BINARY_CHECKSUM(*) * RAND()) as int)) % 100) < 10
WHERE Rnd % 100 < 10  
FROM TABLESAMPLE(10 PERCENT)

你是否考虑生成一个随机数,跳过这个结果? 我的意思是这样的:

        String q = "SELECT COUNT(*) FROM Player p";
        Query query=entityManager.createQuery(q);
        Number countResult=(Number) query.getSingleResult();
        int random = Math.random()*countResult.intValue();
        List<Player> randomPlayers = entityManager.createQuery("SELECT pw.playerId FROM PlayerWallet pw JOIN pw.playerId p"
            + " JOIN p.gameAccountCollection ga JOIN ga.iDAccountStatus acs"
            + " WHERE (SELECT count(col.playerWalletTransactionId) FROM pw.playerWalletTransactionCollection col) > 0 AND acs.code = :status")
            .setParameter("status", "ACTIVATED")
            .setFirstResult(random)
            .setMaxResults(1)
            .getSingleResult();

我已经弄明白了。在检索播放器时,我还检索了其他未使用的相关实体以及与该实体相关的所有实体


添加fetch=FetchType.LAZY后,在需要将实体提取到有问题的关系之前,不要提取实体。查询的性能显著提高。

我已经考虑过了,但查询返回的结果是所有参与者的子集,因此,随机计数器可以从子集中生成结果标识符。因此,使用相同的查询进行计数:SELECT countpw.playerId。。。如果不是太重…这就是它太重的原因。JPQL允许函数。。。使用本机SQL函数。但是JPQL的语法在很多地方都有定义,比如为什么你只需要在中转储一堆SQL并期望它能工作我不知道