JPQL 使用 ObjectDB 对搜索结果进行排序
JPQL ordering the search results, using ObjectDB
我在通过实体可能包含的某些(子)字符串搜索实体时遇到了一个简单的问题。例如。我有 u_name 作为 "rags"、"mechrags"、"meragsch" 的用户,我将输入搜索 window "rags" 和我
使用以下查询搜索包含 "rags"
的字符串
SELECT u FROM User_personal u WHERE u_name LIKE'%rags%'
我想根据搜索字符串 "rags" 在字符串中的首次出现对上述查询 return 的结果进行排序,因此结果将是 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"即数据库顺序
我正在考虑使用子查询,我们先按长度排序,然后在第一次出现 "rags" 时排序结果,结果可能会出现,但查询不是 运行
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)
给出正确的输出建议 BY 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 作为 "rags" 我应该得到所有符合要求的条件 "u" 但它显示如下错误
<h1>HTTP Status 500 - Attempt to execute a query with too few arguments
为了检查,我直接给了 "rags" 并得到了所需的输出,但无法理解传递参数的问题。
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;}
这给出了所有 "u" 和 "rags" 以及 "rags" 的长度和首次出现的顺序
所以我们可以像 "Rags" 或 "RAGS" 那样不区分大小写,或者 "rags" 应该 return 相同的值吗??
完成!!!
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" 这就是我需要的:)
谢天谢地接受任何更好的方法尝试更好的方法
谢谢大家
也许只有 2 个命令表达式?
SELECT 你从 User_personal 你在哪里 u_name 喜欢'%rags%'
按位置排序(u.u_name,'rags'),长度(u.u_name)
我在通过实体可能包含的某些(子)字符串搜索实体时遇到了一个简单的问题。例如。我有 u_name 作为 "rags"、"mechrags"、"meragsch" 的用户,我将输入搜索 window "rags" 和我 使用以下查询搜索包含 "rags"
的字符串 SELECT u FROM User_personal u WHERE u_name LIKE'%rags%'
我想根据搜索字符串 "rags" 在字符串中的首次出现对上述查询 return 的结果进行排序,因此结果将是 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"即数据库顺序
我正在考虑使用子查询,我们先按长度排序,然后在第一次出现 "rags" 时排序结果,结果可能会出现,但查询不是 运行
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)
给出正确的输出建议 BY 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 作为 "rags" 我应该得到所有符合要求的条件 "u" 但它显示如下错误
<h1>HTTP Status 500 - Attempt to execute a query with too few arguments
为了检查,我直接给了 "rags" 并得到了所需的输出,但无法理解传递参数的问题。
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;}
这给出了所有 "u" 和 "rags" 以及 "rags" 的长度和首次出现的顺序
所以我们可以像 "Rags" 或 "RAGS" 那样不区分大小写,或者 "rags" 应该 return 相同的值吗??
完成!!!
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" 这就是我需要的:)
谢天谢地接受任何更好的方法尝试更好的方法 谢谢大家
也许只有 2 个命令表达式?
SELECT 你从 User_personal 你在哪里 u_name 喜欢'%rags%' 按位置排序(u.u_name,'rags'),长度(u.u_name)