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)