2016-04-25 33 views
-1

我实现了一种方法,可以自动生成一个测试(整个问题),但问题是: 该方法显然需要随机问题的数量,但也产生问题的类别(我有一个entié类别,因此也是一个表)我不知道我会在哪里把类别查询。 其次RANDOM()不被JPQL采取,我该怎么办?methode JEE implementation

schema of the DataBase

public List<Question> prepareRandomTest(int number_of_questions, Categorie  categorie){ 
     String jpql = "SELECT q FROM Question q ORDER BY RANDOM() LIMIT "+number_of_questions ; 
    Query query = entityManager.createQuery(jpql); 
     return query.getResultList(); 
    } 
+0

'entityManager.persist(Question.class);'?! –

+0

@CássioMazzochiMolin我在我的程序中更正了 – Daly

回答

1

你正试图在这里使用Java持久化查询语言,因此您的解决方案没有采取随机进去。使用本机查询并从本地sql字符串构建查询,本机查询只是一个没有Entity对象引用的简单sql语句(如Question)。这样一个普通的sql关键字像RANDOM等很容易被读取。

Native Query Tutorial

,而不是使用的

String jpql = "SELECT q FROM Question q ORDER BY RANDOM() LIMIT "+number_of_questions ; 

使用:

"SELECT * FROM question where category="+category+" ORDER BY RANDOM() LIMIT "+number_of_questions; 

额外建议: 获得由 “枚举” 一类的字符串在代码匹配数据库类中的字符串值血腥专栏。

+0

我使用JPQL,因此如果我使用简单的SQL查询不会导致问题? – Daly

+0

无论你使用的是JPQL还是Sql查询字符串,hibernate都会自己协商创​​建这样的查询对象(Query query = entityManager.createQuery(jpql or sql);),所以你不用担心原生查询会打破你的代码,这是hibernate提供的强制抽象。 –

+0

是否正确?公共列表 prepareRandomTest(int number_of_questions,Categorie categorie){ \t \t String sql =“SELECT * FROM question where category =”+ categorie +“ORDER BY RANDOM()LIMIT”+ number_of_questions; \t \t SQLQuery query = session.createSQLQuery(sql); \t \t \t \t列表 results =(列表)query.list(); \t \t返回结果; \t \t} – Daly