【问题标题】:JPQL ordering the search results, using ObjectDBJPQL 使用 ObjectDB 对搜索结果进行排序
【发布时间】:2017-10-27 18:31:14
【问题描述】:

我正面临通过一些(子)字符串搜索实体的简单问题,它们可能包含。例如。我有 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”,这就是我需要的:)

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

【问题讨论】:

  • JPA 提供者调用的 SQL 是什么?这会告诉您您的查询是否正确
  • 尼尔我正在使用 JPQL ODB
  • 我认为错误在于“LOCATE('rags',u.u_name)”。应该是 LOCATE(u.u_name,'rags') 对吧???
  • 任何人请帮帮我,我在过去 2 天里都被打动了
  • 我正在使用 ODB 资源管理器,我知道 ODB 资源管理器不支持嵌套查询现在该怎么办:(((

标签: java jpa orm jpql objectdb


【解决方案1】:

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

SELECT u FROM User_personal u WHERE u_name LIKE'%rags%' ORDER BY LOCATE(u.u_name,'rags'), LENGTH(u.u_name)

【讨论】:

    猜你喜欢
    • 2011-10-16
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2013-04-28
    • 2016-05-21
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多