使用现有数据库(模型)进行玩耍。

huangapple 未分类评论46阅读模式
英文:

Using play with existing database ( models )

问题

我可以使用与现有数据库(例如 SAP DBB)关联的 Play Framework 以仅显示:

    
    仪表板(查询)
    图表(查询)

我开发了一个身份验证页面,突然之间,我没有考虑过如何从现有数据库中提取数据,而不需要声明模型!

仅提取使用多个查询的数据并在视图 Scala(Play Framework JAVA)上显示的良好方式是什么?

非常感谢

英文:

Can i use play framework linked to an existing database (Example SAP DBB) to only display :

Dashboards (Queries)
Charts (Queries)

I developped an authentication page, suddenly, i did not tought about how to extract data from an existing database without declaring models!

What is the good way to only extract with many queries data and display it on views scala (Play framework JAVA) ?

Thank you so much

答案1

得分: 0

// 创建一个用于存储必要字段的案例类,代表数据库表中的行
case class Positionstext(akt_abnr: Int
                         , akt_text_art: Int
                         , akt_text_pos: Int
                         , akt_text: String) {
}

// 构建 SQL 查询语句以从一个或多个表中检索行
def positionstexte(x: Int): List[Positionstext] = {
  DB.withConnection { connection =>
    val select =
      """select plr_ak_texte.akt_abnr
                , plr_ak_texte.akt_text_art
                , plr_ak_texte.akt_text_pos
                , plr_ak_texte.akt_text
         from plrv11.plr_ak_texte
                , plrv11.plr_auftr_status
        where plr_ak_texte.akt_abnr     =  plr_auftr_status.as_abnr
          and plr_ak_texte.akt_aend_ix  =  plr_auftr_status.as_aend_ix
          and plr_ak_texte.akt_abnr     =  ?
          and plr_ak_texte.akt_text_art =  7
          and plr_auftr_status.as_aend_ix <> 99
      """

    val prepareStatement = connection.prepareStatement(select)

    prepareStatement.setInt(1, x)

    val rs = prepareStatement.executeQuery

    var list: ListBuffer[Positionstext] = scala.collection.mutable.ListBuffer()

    while (rs.next) {
      list += new Positionstext(rs.getInt("akt_abnr")
                                , rs.getInt("akt_text_art")
                                , rs.getInt("akt_text_pos")
                                , rs.getString("akt_text"))
    }
    rs.close()
    prepareStatement.close()
    list.toList
  }
}

// SQL 查询已经执行了大部分工作,包括使用子查询、连接等
// 所有需要的对象现在都在列表中,可以在视图中显示

注意:以上内容为你提供的代码的中文翻译,只包含了翻译后的部分,去除了代码注释和多余的信息。

英文:

We also have many existing databases, without having a complete model of each table in Play applications. I create a case class in the Play application for all necessary fields, also a subset of all columns. It's Scala code, but also possible with Java, of course.

  case class Positionstext(akt_abnr: Int
                   , akt_text_art: Int
                   , akt_text_pos: Int
                   , akt_text: String) {

}

The carefully assembled SQL command retrieves rows from one or more tables.

  def positionstexte(x: Int) : List[Positionstext] = {

    DB.withConnection{ connection =&gt;

    val select =
      &quot;&quot;&quot; select plr_ak_texte.akt_abnr
               , plr_ak_texte.akt_text_art
               , plr_ak_texte.akt_text_pos
               , plr_ak_texte.akt_text
            from plrv11.plr_ak_texte
               , plrv11.plr_auftr_status
           where plr_ak_texte.akt_abnr     =  plr_auftr_status.as_abnr
             and plr_ak_texte.akt_aend_ix  =  plr_auftr_status.as_aend_ix
             and plr_ak_texte.akt_abnr     =  ?
             and plr_ak_texte.akt_text_art =  7
             and plr_auftr_status.as_aend_ix &lt;&gt; 99
       &quot;&quot;&quot;

    val prepareStatement = connection.prepareStatement(select)

    prepareStatement.setInt(1, x)

    val rs = prepareStatement.executeQuery

    var list: ListBuffer[Positionstext] = scala.collection.mutable.ListBuffer()

    while (rs.next) {
      list += new Positionstext(rs.getInt(&quot;akt_abnr&quot;)
                            , rs.getInt(&quot;akt_text_art&quot;)
                            , rs.getInt(&quot;akt_text_pos&quot;)
                            , rs.getString(&quot;akt_text&quot;))
    }
    rs.close()
    prepareStatement.close()
    list.toList
  }

And that's it! The SQL command already does most of the work by using sub-queries, joins etc.

All desired objects are in the list now and can display in the view.

答案2

得分: 0

感谢您的回复,

这是我所做的,它运行得很好:

package controllers;

import models.Sysuser;
import models.DataI;
import models.DataII;
import play.mvc.Controller;
import play.mvc.Result;
import play.mvc.Security;
import views.html.sitemap.index;

import javax.inject.*;
import java.util.concurrent.CompletionStage;
import play.libs.concurrent.HttpExecutionContext;
import static java.util.concurrent.CompletableFuture.supplyAsync;

import io.ebean.*;
import play.Logger;
import java.util.List;
import play.libs.Json;
import java.util.*;
import java.util.stream.*;

@Security.Authenticated(Secured.class)
public class SiteMap extends Controller {

    private final HttpExecutionContext httpExecutionContext;
    private static final Logger.ALogger logger = Logger.of(SiteMap.class);

    @Inject
    public SiteMap(HttpExecutionContext httpExecutionContext) {
        this.httpExecutionContext = httpExecutionContext;
    }	

    public CompletionStage<Result> index() {
        return supplyAsync(() -> {		  
            return ok(views.html.sitemap.index.render(Sysuser.findByUserName(request().username()), QueryI(), QueryII()));
        }, httpExecutionContext.current());
    }

    /**
     * Custom Query 1
     */ 
    public List<DataI> QueryI() {
        final String sql = "SELECT sysuser_id, role_id "
                           + "from sysuser_role "
                           + "where sysuser_id = '1' "
                           + "and role_id in ('1','2','3','4','5') ";
        final RawSql rawSql = RawSqlBuilder.parse(sql).create();				
        Query<DataI> query = Ebean.find(DataI.class);  
        query.setRawSql(rawSql);
        List<DataI> L = query.findList();
        return L;
    }

    /**
     * Custom Query 2
     */ 
    public List<DataII> QueryII() {
        final String sql = "SELECT sysuser.name, sysuser.active, department.description "
                           + "from sysuser "
                           + "left join department on department.id = sysuser.department_id "
                           + "where sysuser.id = '2' ";
        final RawSql rawSql = RawSqlBuilder.parse(sql).create();				
        Query<DataII> query = Ebean.find(DataII.class);  
        query.setRawSql(rawSql);
        List<DataII> L = query.findList();
        return L;
    }	
}

我使用的是Java而不是Scala,然而,我认为这些代码是不需要的,比如:
1- DB.withConnection{ connection =>
2- val prepareStatement = connection.prepareStatement(select)
...还有什么其他的...

您觉得我的代码怎么样?是否最优?我将使用复杂的查询来填充一些仪表板,该模板位于:https://adminlte.io/themes/v3/index.html

英文:

Thank you for your return,

This is what i did and it works pretty fine :

package controllers;

import models.Sysuser;
import models.DataI;
import models.DataII;
import play.mvc.Controller;
import play.mvc.Result;
import play.mvc.Security;
import views.html.sitemap.index;

import javax.inject.*;
import java.util.concurrent.CompletionStage;
import play.libs.concurrent.HttpExecutionContext;
import static java.util.concurrent.CompletableFuture.supplyAsync;

import io.ebean.*;
import play.Logger;
import java.util.List;
import play.libs.Json;
import java.util.*;
import java.util.stream.*;

@Security.Authenticated(Secured.class)
public class SiteMap extends Controller {
	
	private final HttpExecutionContext httpExecutionContext;
	private static final Logger.ALogger logger = Logger.of(SiteMap.class);

    @Inject
    public SiteMap(HttpExecutionContext httpExecutionContext) {
        this.httpExecutionContext = httpExecutionContext;
    }	

	
	
    public CompletionStage&lt;Result&gt; index() {
      return supplyAsync(() -&gt; {		  
		return ok(views.html.sitemap.index.render(Sysuser.findByUserName(request().username()), QueryI(), QueryII() ));
	    }, httpExecutionContext.current());
    }
  

    /**
	 * Custom Query 1
	 */ 
    public List&lt;DataI&gt; QueryI() {
                final String sql =  &quot;SELECT sysuser_id, role_id &quot;
				                   +&quot;from sysuser_role &quot;
								   +&quot;where sysuser_id = &#39;1&#39; &quot;
								   +&quot;and role_id in (&#39;1&#39;,&#39;2&#39;,&#39;3&#39;,&#39;4&#39;,&#39;5&#39;) &quot;;
				final RawSql rawSql = RawSqlBuilder.parse(sql).create();				
				Query&lt;DataI&gt; query = Ebean.find(DataI.class);  
                query.setRawSql(rawSql);
                List&lt;DataI&gt; L = query.findList();
    return(L);
    }
	
	
    /**
	 * Custom Query 2
	 */ 
    public List&lt;DataII&gt; QueryII() {
                final String sql =  &quot;SELECT sysuser.name, sysuser.active, department.description &quot;
				                   +&quot;from sysuser &quot;
								   +&quot;left join department on department.id = sysuser.department_id &quot;
								   +&quot;where sysuser.id = &#39;2&#39; &quot;;
				final RawSql rawSql = RawSqlBuilder.parse(sql).create();				
				Query&lt;DataII&gt; query = Ebean.find(DataII.class);  
                query.setRawSql(rawSql);
                List&lt;DataII&gt; L = query.findList();
    return(L);
    }	
	
	
  
  
  
}

I am using Java instead of Scala, however, i don't think that there is a need of these codes such as :
1- DB.withConnection{ connection =>
2- val prepareStatement = connection.prepareStatement(select)
....and what else...

What do you think about my code? is it optimal ? I am going to use complexe queries to fill some dashboards in this template : https://adminlte.io/themes/v3/index.html

huangapple
  • 本文由 发表于 2020年5月4日 02:54:49
  • 转载请务必保留本文链接:https://java.coder-hub.com/61579968.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定