2016-10-10 14 views
0

私はSpring、Thymeleaf、jOOQを使い始めています。私は概要でデータベースルックアップの結果を表示したいと思います。 select()。(CONFIGURATIONS)からクエリを実行すると、Thymeleafビューは正常に機能します。しかし、Userテーブルに参加してidの代わりにユーザーの名前を結果に追加したい場合は、エラーが発生します。ThymeleafビューがjOOQジョインクエリのプロパティ/フィールドを見つけることができません

これは、ウェブブラウザでのエラーです:

月10月10日午後04時04分17秒CEST 2016 予期しないエラー(タイプ=内部サーバーエラー、状況= 500)がありました。 SpringEL発現を評価 例外: "config.name"(概要:37)

これはEclipseでエラーです:

org.springframework.expression.spel.SpelEvaluationException:EL1008E:(POS 7 ): 'org.jooq.impl.RecordImpl'型のオブジェクトでプロパティまたはフィールド 'name'を見つけることができません。おそらくpublicではないでしょうか?

私のビューコードは間違っていますが、正しい「property.field」を取得するために「config.name」を変更する必要があるかどうかわかりません。

は、これは私のコントローラです:

@Controller 
public class OverviewController 
{ 
    public ArrayList configurationList = new ArrayList(); 

    @RequestMapping("/overview") 
    public String showConfigurationList(Model model) 
    { 
     model.addAttribute("configs", getConfigurations()); 
     return "overview"; 
    } 

    public ArrayList getConfigurations() 
    { 
     try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) 
     { 
      DSLContext create = DSL.using(conn, SQLDialect.POSTGRES_9_5); 
      Result<Record5<String, String, Timestamp, String, String>> result = create.select(CONFIGURATION.NAME, CONFIGURATION.VERSION, CONFIGURATION.DATE_MODIFIED, CONFIGURATION.AUTHOR_USER_ID, USER.NAME) 
        .from(USER).join(CONFIGURATION) 
        .on(CONFIGURATION.AUTHOR_USER_ID.equal(USER.ID))) 
        .fetch(); 
      /*Result<Record> result = create.select() 
        .from(CONFIGURATION) 
        .fetch();*/ 

      if(configurationList.isEmpty() == true) 
      { 
       for (Record5 r : result) {     
       configurationList.add(r); 
       } 
      }    
     }    
     catch (Exception e) 
     { 
      System.out.println("ERROR: " + e);   
     } 
     return configurationList; 
    } 

そして、これはThymeleaf図である:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:th="http://www.thymeleaf.org"> 
<head> 
    <title>Nazza Mediator - Overview</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 
    <link rel="stylesheet" href="webjars/bootstrap/3.3.7-1/css/bootstrap.min.css" /> 
    <script src="http://code.jquery.com/jquery.js" /> 
    <script src="webjars/bootstrap/3.3.7-1/js/bootstrap.min.js" /> 
</head> 

<body> 
<nav class="navbar navbar-default"> 
    <div class="container-fluid"> 
    <div class="navbar-header"> 
     <a class="navbar-brand" href="/">Nazza Mediator</a> 
    </div> 
    <ul class="nav navbar-nav"> 
     <li><a href="/">Home</a></li> 
     <li class="active"><a href="/overview">Configuration Overview</a></li> 
    </ul> 
    </div> 
</nav> 

    <h3>Configuration Overview</h3> 

    <table class="table table-hover"> 
     <tr> 
     <th>NAME</th> 
     <th>VERSION</th> 
     <th>DATE MODIFIED</th> 
     <th>AUTHOR</th> 
     </tr> 
     <tr th:each="config : ${configs}"> 
     <td th:text="${config.name}"></td> 
     <td th:text="${config.version}"></td> 
     <td th:text="${config.dateModified}"></td> 
     <td th:text="${config.authorUserId}"></td> 
     </tr> 
    </table> 
    </body> 

</html> 

答えて

2

私はあなたがjOOQコードジェネレータの稼働を持っていると仮定します。

あなたが最初の選択

Result<Record> result = create.select() 
       .from(CONFIGURATION) 
       .fetch(); 

を使用しているときに、あなたが実際にResult<ConfigurationRecord>になってしまいますし、その一つはThymeleafで使用できるアクセサgetNameを持っています。

結合を書き留めてフィールドを手動で追加する場合は、汎用レコード、つまり#get(String fieldName)とその他のものしか提供しない実装を使用します。あなたはあなたがすべてのフィールドのためにこれをしなければならない

<td th:text="${config.get('NAME')}"></td> 

を次のように値へのアクセス権を変更する必要があり、あなたのビューで

しかし、クエリでは "name"という名前の2つのフィールドがありますので、そのうちの1つをエイリアスする必要があります。たとえば、USER.NAME.as('userName')と取得の呼び出しで使用します。

それが役立つかどうか教えてください。

もう1つの編集:ルーカス・エダー・オブ・ジャパンよりご連絡くださいconfig['NAME']:これは一般的なレコードでは不可能ですが、特定のものでのみ可能です。また、フィールド名を参照するすべてのケースでは、大文字と小文字が区別されるため注意が必要です。

+1

はい、うまくいきました!ソリューションをありがとう、説明してくれてありがとう、私は今なぜ私のコードがうまくいかないのか理解しています。 – Kailayla