同一视图中的多个查询
Multiple queries in the same view
我想 运行 多个查询然后在页面中显示结果,例如:
https://adminlte.io/themes/v3/index.html
我创建了第一个控制器查询:
package controllers;
import models.Sysuser;
import play.mvc.Controller;
import play.mvc.Result;
import play.mvc.Security;
import views.html.sitemap.index;
import javax.inject.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import play.libs.concurrent.HttpExecutionContext;
import static java.util.concurrent.CompletableFuture.supplyAsync;
import play.db.*;
import io.ebean.*;
import play.Logger;
import java.util.List;
import java.util.ArrayList;
import models.LocationExtractedData;
@Security.Authenticated(Secured.class)
public class SiteMap extends Controller {
private Database db;
private final HttpExecutionContext httpExecutionContext;
private static final Logger.ALogger logger = Logger.of(SiteMap.class);
@Inject
public SiteMap(Database db,
HttpExecutionContext httpExecutionContext) {
this.db = db;
this.httpExecutionContext = httpExecutionContext;
}
public CompletionStage<Result> index() {
return SearchSomething().thenApplyAsync((List<LocationExtractedData> infos) -> {
return ok(views.html.sitemap.index.render( Sysuser.findByUserName(request().username()), infos) );
}, httpExecutionContext.current());
}
public CompletionStage<List<LocationExtractedData>> SearchSomething() {
return CompletableFuture.supplyAsync(() -> {
return db.withConnection(
connection -> {
// Imagines this is a complexe QUERY (Later in the future...)
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<LocationExtractedData> query = Ebean.find(LocationExtractedData.class);
query.setRawSql(rawSql);
List<LocationExtractedData> list = query.findList();
return list;
});
}, httpExecutionContext.current());
}
}
你能告诉我如何为充满仪表板、图表和表格的页面同时 运行 多个优化查询吗!
如果我创建多个 ebeanLists 列表(查询),这会影响我的页面加载吗?
如果没有,那我该怎么办?
提前谢谢你,
通常,在类似于您提供的 link 的应用程序中,您可以按照 MVC 设计模式创建可重用的 API。从控制器查询数据库非常违背这种模式。
每个 API 应该是原子的,创建一个 API 到 运行 1 查询来获取该页面的所有数据不是正确的方法。
如果您正在寻找 API 的性能,您应该熟悉异步编程。 运行您的 APIs async 将允许您的后端同时处理多个前端请求,从而大大提高性能。
我想 运行 多个查询然后在页面中显示结果,例如: https://adminlte.io/themes/v3/index.html
我创建了第一个控制器查询:
package controllers;
import models.Sysuser;
import play.mvc.Controller;
import play.mvc.Result;
import play.mvc.Security;
import views.html.sitemap.index;
import javax.inject.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import play.libs.concurrent.HttpExecutionContext;
import static java.util.concurrent.CompletableFuture.supplyAsync;
import play.db.*;
import io.ebean.*;
import play.Logger;
import java.util.List;
import java.util.ArrayList;
import models.LocationExtractedData;
@Security.Authenticated(Secured.class)
public class SiteMap extends Controller {
private Database db;
private final HttpExecutionContext httpExecutionContext;
private static final Logger.ALogger logger = Logger.of(SiteMap.class);
@Inject
public SiteMap(Database db,
HttpExecutionContext httpExecutionContext) {
this.db = db;
this.httpExecutionContext = httpExecutionContext;
}
public CompletionStage<Result> index() {
return SearchSomething().thenApplyAsync((List<LocationExtractedData> infos) -> {
return ok(views.html.sitemap.index.render( Sysuser.findByUserName(request().username()), infos) );
}, httpExecutionContext.current());
}
public CompletionStage<List<LocationExtractedData>> SearchSomething() {
return CompletableFuture.supplyAsync(() -> {
return db.withConnection(
connection -> {
// Imagines this is a complexe QUERY (Later in the future...)
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<LocationExtractedData> query = Ebean.find(LocationExtractedData.class);
query.setRawSql(rawSql);
List<LocationExtractedData> list = query.findList();
return list;
});
}, httpExecutionContext.current());
}
}
你能告诉我如何为充满仪表板、图表和表格的页面同时 运行 多个优化查询吗!
如果我创建多个 ebeanLists 列表(查询),这会影响我的页面加载吗? 如果没有,那我该怎么办?
提前谢谢你,
通常,在类似于您提供的 link 的应用程序中,您可以按照 MVC 设计模式创建可重用的 API。从控制器查询数据库非常违背这种模式。
每个 API 应该是原子的,创建一个 API 到 运行 1 查询来获取该页面的所有数据不是正确的方法。
如果您正在寻找 API 的性能,您应该熟悉异步编程。 运行您的 APIs async 将允许您的后端同时处理多个前端请求,从而大大提高性能。