在数据库中搜索

时间:2011-09-21 08:50:23

标签: java mysql hibernate

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

当我填写搜索表单时,我没有指定SURNAME和大学,我希望我的搜索结果是每个学生,其中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'或其他值未提供或提供null或将被跳过的内容。

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

3 个答案:

答案 0 :(得分:1)

如果您想使用通配符,则需要使用LIKE,而不是=

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

然而,将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多岁的人。

答案 1 :(得分:0)

有很多方法可以做到这一点。但对于所有这些人,您需要从Session抓取Hibernate。从那时起你可以:

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

所有这些,只需query.list()criteria.list()

欲了解更多信息:

答案 2 :(得分:0)

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