JPA:选择随机行

use*_*286 4 java jpa named-query jpql

这是我的JPA ENTITY

@Entity
@NamedQueries({  
        @NamedQuery(name = "Question.randQuestion", query = "SELECT q FROM Question AS q ORDER BY     RANDOM")
})
@Table(name = "questions")
public class Question implements Serializable {
.....
}
Run Code Online (Sandbox Code Playgroud)

问题是:

eclipse给了我这个namedQuery的错误.它说:"在FROM子句中没有定义标识变量'RANDOM'"

我也试过RAND()而不是RANDOM和NEWID().

谢谢.

vel*_*s4j 6

要获得随机行,首先获得总问题列表并获取任何一个.

public Question  getRandomQuestion(EntityManager em) {
  Query countQuery = em.createNativeQuery("select count(*) from Question");
  long count = (Long)countQuery.getSingleResult();

  Random random = new Random();
  int number = random.nextInt((int)count);

  Query selectQuery = em.createQuery("select q from Question q");
  selectQuery.setFirstResult(number);
  selectQuery.setMaxResults(1);
  return (Question)selectQuery.getSingleResult();
}
Run Code Online (Sandbox Code Playgroud)

注意:您可能需要实现一个逻辑,以避免在多次调用方法时出现重复.


Ale*_* K. -1

据我了解,您想从表中选择随机问题。您宁愿使用 WHERE 子句,并从代码中提供一些参数,例如:

SELECT q FROM Question AS q WHERE id = :id
Run Code Online (Sandbox Code Playgroud)

然后在创建查询的代码中,您必须生成要选择的随机 ID:

query.setParam("id", getRandomId());
Run Code Online (Sandbox Code Playgroud)

为了获得随机 id,您可能需要从数据库查询行数并使用java.util.Random.nextInt(rowsCount)(当然,如果所有 id 都在那里)。

顺便说一句,这里描述了类似的内容:http ://www.shredzone.de/cilla/page/53/how-to-fetch-a-random-entry-with-hibernate.html

  • 仅当 ids 在数据库上连续时才有效。 (5认同)