2017-05-26 74 views
1

我面临着通过某些(子)字符串搜索实体的简单问题,它们可能包含这些字符串。例如。我有u_name用户的“衣服”,“mechrags”,“meragsch”我将进入到搜索窗口中的“衣服”,我 使用下面的查询搜索含有“破布”JPQL对搜索结果进行排序,使用ObjectDB

SELECT u FROM User_personal u WHERE u_name LIKE'%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”的“衣服”,” meragsch “ ”mechrags“ 答案

应该是 ”衣服“, ”ragsch“, ”meragsch“, ”mechrags“,但输出中是

”ragsch“, ”衣服“, ”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作为“抹布”我应该得到所有“ ü“,但它显示如下错误

<h1>HTTP Status 500 - Attempt to execute a query with too few arguments 

For checkin g我直接给了“破布”,并得到了必要的输出,但在通过论证时不能理解问题。

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;}* 

给出正确的输出。

谁能SUGGEST正确方法在这里用变

得到它!!!!!!

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“或”抹布“应返回相同的值

DONE !!!

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

如果我给“衣服”发现“衣服”和“衣服”和“衣服”和多数民众赞成什么,我需要:)

任何更好的方法是值得庆幸的接受拉升更好的方法 THANK YOU ALL

+0

什么是JPA提供者调用SQL?这将告诉你,如果您的查询是正确的 –

+0

Neil我正在使用JPQL ODB – rags18333333

+0

我认为这里的错误在于“LOCATE('rags',u.u_name)”。它应该是LOCATE(u.u_name,'rags')正确的? – rags18333333

回答

0

也许只是2个表达式?

选择[u] FROM User_personalüWHERE u_name LIKE '%破布%' ORDER BY LOCATE(u.u_name, '抹布'),长度(u.u_name)

+0

awesome !!!正确地工作非常感谢你 – rags18333333

相关问题