2017-05-26 21 views
1

エンティティを含むエンティティを検索する際に、エンティティが含む可能性のある(サブ)文字列で簡単な問題に直面しています。例えば。私が欲しい私は「ぼろ」、「mechrags」、「meragsch」としてu_nameを持つユーザーを持っていると私は窓「ぼろ」を検索するために入り、I 「ぼろ」を含む文字列を検索するため、次のクエリを使用ObjectDBを使用して検索結果を注文するJPQL

SELECT u FROM User_personal u WHERE u_name LIKE'%rags%' 

文字列中の検索文字列 "rags"の最初の出現に基づいて上記のクエリによって返された結果を順序付けるために、結果はrags、meragsch、mechrags(この順番で)になります。

SELECT u FROM User_personal u WHERE u_name LIKE'%rags%' order by 
LOCATE(u.u_name,'rags') 

を次のように私は上記の結果のためにLOCATE関数を使用して考えていますが、4人のユーザー「ragsch」、「ぼろ」は、」がある場合、結果は前のものよりも良いが、 ですmeragsch " "mechrags" 答え

あるべき "ぼろ"、 "ragsch"、 "meragsch"、 "mechrags" が、出力に含まがある

"ragsch"、 "ぼろ"、 "meragsch"、" mechrags "データベースの注文

私は結果が来るかもしれない「ぼろ」の最初の出現に注文した場合、我々は長さに最初の注文サブクエリ、その後、結果を使用することを考えていますが、クエリはAS HERE http://docs.oracle.com/html/E13946_04/ejb3_langref.html#ejb3_langref_subquerie

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') 

を実行していません

誰も正しい出力を得る方法を提案できますか?

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

は今、私は「私は「ぼろ」としてSTRを与える場合、私はすべてを取得する必要

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

以下のような方法でそれを使用して問題を抱えているOBJECT_DB

によって提案された正確な出力を提供しますu "に必要条件がありますが、以下のようにエラーが表示されます

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

チェックイン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;}* 

は正しい出力を示します。

は、誰もが

はそれを得たHERE変数を使用しての正しい方法を提案することができます!!!!!!

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 "は同じ値を返す必要がありますか?

完了!

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」を見つけて、私は必要なもののthats :)

任意のより良い方法は、ありがたいことに、より良い方法 THANKのための試みを受け入れていますあなたはすべて

+0

JPAプロバイダによって呼び出されたSQLとは何ですか?それはあなたのクエリが正しいかどうかを教えてくれるでしょう –

+0

ニール私はJPQL ODBを使用しています – rags18333333

+0

私はここに「LOCATE( 'rags'、u.u_name)」の間違いがあると思います。それはLOCATE(u.u_name、 'rags')でなければなりませんか? – rags18333333

答えて

0

おそらく2つの順序式ですか?

がUser_personal U UからのSELECT WHERE u_name LIKE '%のぼろの%' BY ORDER LOCATE(u.u_name、 'ぼろ')、LENGTH(u.u_name)

+0

を試してみてください!!! – rags18333333

関連する問題