gpt4 book ai didi

java - 使用 ObjectDB JPQL 对搜索结果进行排序

转载 作者:太空宇宙 更新时间:2023-11-04 11:27:16 25 4
gpt4 key购买 nike

我面临着通过某些(子)字符串搜索实体的简单问题,它们可能包含这些字符串。例如。我有 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”即数据库顺序

我正在考虑使用子查询,我们首先按长度排序,然后按结果排序,如果在第一次出现“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) 

给出 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;}

这给出了所有带有“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”,这就是我需要的:)

谢天谢地,任何更好的方法都被接受,尝试更好的方法 谢谢大家

最佳答案

也许只有 2 个顺序表达式?

从 User_personal u 中选择 u,其中 u_name LIKE'%rags%' 按位置排序(u.u_name,'rags'),长度(u.u_name)

关于java - 使用 ObjectDB JPQL 对搜索结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44208758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com