2011-09-21 176 views
0

我需要一些建议如何在数据库中执行搜索。例如我在数据库中有一个表名为:Student的列是:NAME, SURNAME, UNIVERSITY, AGE, COURSE在数据库中搜索

当我填写搜索表单时,我没有指定SURNAME和UNIVERSITY,我希望我的搜索结果是每个学生,其中NAME =我指定的名称,年龄 - 我指定的年龄和课程 - 我指定的课程和SURNAME和大学可以是任何。

有人可以给我一些建议吗?

编辑

感谢快速重播。但似乎我不明白的东西或它不工作。这是我真正的查询:

SELECT UNIVERSITY, INFORMANT_NAME, AGE 
FROM informant 
WHERE UNIVERSITY='%VDU%' 
    AND INFORMANT_NAME='%Mindaugas Jonaitis%' 
    AND AGE='%21%'; 

它不会返回任何结果。

SELECT UNIVERSITY, INFORMANT_NAME, AGE 
FROM informant 
WHERE UNIVERSITY='VDU' 
    AND INFORMANT_NAME='Mindaugas Jonaitis' 
    AND AGE='21'; 

此查询确实存在,但仅限于指定的值。我希望返回的结果是来自表格的所有数据,其中UNIVERSITY = 'VDU'或其他值未提供或提供空值或将被跳过的内容。

SELECT UNIVERSITY, INFORMANT_NAME, AGE 
FROM informant 
WHERE UNIVERSITY='VDU' 
    AND INFORMANT_NAME='????' 
    AND AGE='????'; 

回答

0

有很多方法可以这样做。但是对于他们所有人而言,您需要从Hibernate获取Session。从你这一点可以:

  • 创建从named query
  • 一个query对象创建从sql string
  • 一个Query对象创建Criteria对象

所有这些话,只是或者是query.list()criteria.list()

欲了解更多信息:

1

如果你想使用你需要使用LIKE,不=通配符。

​​

但是使用like与领先的通配符将禁用该字段上使用索引的任何机会。
如果你正在使用MySQL于MyISAM,把一个一个全文索引你想用通配符和使用搜索字段:

SELECT UNIVERSITY, INFORMANT_NAME, AGE 
FROM informant 
WHERE UNIVERSITY LIKE '%VDU%' 
    AND MATCH(INFORMANT_NAME) AGAINST('Mindaugas Jonaitis') 
    AND AGE LIKE '21%'; 

Match .. against将只对搜索短语比4个字符长的工作。而且,在年龄上与领先的通配符一起搜索真的没有意义。我通常不想让所有的人都是21,31,41,但我经常想要得到所有20岁的人。

0

findByExample DAO方法在这里总是很有用。