我面临着通过一些(子)字符串搜索实体的简单问题,它们可能包含。例如,我有 u_name 为“rags”、“mechrags”、“meragsch”的用户,我将进入搜索窗口“rags”,我使用以下查询搜索包含“rags”的字符串
SELECT u FROM User_personal u WHERE u_name LIKE'%rags%'
我想根据字符串中首次出现的搜索字符串“rags”对上述查询返回的结果进行排序,因此结果将是 rags、meragsch、mechrags(按此顺序)。
我正在考虑对上述结果使用 LOCATE 函数,如下所示
SELECT u FROM User_personal u WHERE u_name LIKE'%rags%' order by
LOCATE(u.u_name,'rags')
但是结果比前一个要好但是如果有 4 个用户 "ragsch","rags","meragsch","mechrags" 答案
应该是 "rags","ragsch","meragsch","mechrags" 但输出是
"ragsch","rags","meragsch","mechrags" 即数据库顺序
我正在考虑使用子查询,我们首先按长度排序,然后在第一次出现“破布”时排序结果,结果可能会出现,但查询没有运行
select user from User_personal user where exists (select u from User_personal u where u.u_name like'%rags%' order by LENGTH(u.u_name)) order by LOCATE(user.u_name,'rags')
在这里http://docs.oracle.com/html/E13946_04/ejb3_langref.html#ejb3_langref_subquerie
谁能建议一种获得正确输出的方法?
SELECT u FROM User_personal u WHERE u_name LIKE'%rags%' ORDER BY LOCATE(u.u_name,'rags'), LENGTH(u.u_name)
给出由 OBJECT_DB 建议的正确输出
现在我在以下方法中使用它时遇到问题
public static List<User_personal> search(String str, EntityManager em)
{
String dup ="%"+str+"%";
Query q = ("SELECT u FROM User_personal u WHERE u_name LIKE :dup ORDER
BY LOCATE(u.u_name,'rags'), LENGTH(u.u_name)",User_personal.class)
List<User_personal> result = q.getResultList();
if (!result.isEmpty()) {
return result;
}
return null;}*
如果我将 str 作为“破布”,我应该得到所有具有所需条件的“u”,但它显示如下错误
<h1>HTTP Status 500 - Attempt to execute a query with too few arguments
为了检查,我直接给出了“破布”并获得了所需的输出,但无法理解传递参数的问题。
public static List<User_personal> search(String str,EntityManager em)
{
//String dup ="%"+str+"%";
Query q = ("SELECT u FROM User_personal u WHERE u_name LIKE '%rags%'
ORDER BY LOCATE(u.u_name,'rags'), LENGTH(u.u_name)",User_personal.class)
List<User_personal> result = q.getResultList();
if (!result.isEmpty()) {
return result;
}
return null;}*
给出正确的输出。
任何人都可以在这里建议使用变量的正确方法
知道了!!!!!!
public static List<User_personal> search(String str, EntityManager em) {
Query q = em.createQuery("SELECT u FROM User_personal u WHERE
CONCAT(u.fname,u.lname) LIKE :name ORDER BY
LOCATE(CONCAT(u.fname,u.lname),'rags'),
LENGTH(CONCAT(u.fname,u.lname))",
User_personal.class);
q.setParameter("name", "%"+str+"%");
List<User_personal> result = q.getResultList();
if (!result.isEmpty()) {
return result;
}
return null;}
这给了所有带有“rags”的“u”,并且也按照“rags”的长度和第一次出现的顺序
那么我们可以像“Rags”或“RAGS”或“rags”这样不区分大小写的方法返回相同的值吗?
完毕!!!
public static List<User_personal> search(String str, EntityManager em) {
Query q = em.createQuery("SELECT u FROM User_personal u WHERE
lower(CONCAT(u.fname,u.lname)) LIKE lower(:name) ORDER BY
LOCATE(CONCAT(u.fname,u.lname),'rags'),
LENGTH(CONCAT(u.fname,u.lname))",
User_personal.class);
//SELECT u FROM User u WHERE lower(u.username) LIKE :username
q.setParameter("name", "%"+str+"%");
List<User_personal> result = q.getResultList();
if (!result.isEmpty()) {
return result;
}
return null;}
如果我给“Rags”,它会找到“rags”、“Rags”和“RAGS”,这就是我需要的:)
谢天谢地,任何更好的方法都被接受尝试更好的方法谢谢大家