Java 同一视图中的多个查询
我希望运行多个查询,然后在页面中显示结果,例如: 我创建第一个控制器查询:Java 同一视图中的多个查询,java,sql,scala,playframework,ebean,Java,Sql,Scala,Playframework,Ebean,我希望运行多个查询,然后在页面中显示结果,例如: 我创建第一个控制器查询: 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.Com
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());
}
}
包控制器;
导入模型.Sysuser;
导入play.mvc.Controller;
导入play.mvc.Result;
导入play.mvc.Security;
导入views.html.sitemap.index;
导入javax.inject.*;
导入java.util.concurrent.CompletableFuture;
导入java.util.concurrent.CompletionStage;
导入play.libs.concurrent.HttpExecutionContext;
导入静态java.util.concurrent.CompletableFuture.SupplySync;
导入play.db.*;
输入io.ebean.*;
导入play.Logger;
导入java.util.List;
导入java.util.ArrayList;
导入models.LocationExtractedData;
@Security.Authenticated(securied.class)
公共类站点地图扩展控制器{
专用数据库数据库;
私有最终HttpExecutionContext HttpExecutionContext;
private static final Logger.ALogger Logger=Logger.of(SiteMap.class);
@注入
公共站点地图(数据库数据库数据库、,
HttpExecutionContext(HttpExecutionContext){
这个.db=db;
this.httpExecutionContext=httpExecutionContext;
}
公共完成阶段索引(){
返回SearchSomething()。然后应用程序同步((列表信息)->{
返回ok(views.html.sitemap.index.render(Sysuser.findByUserName(request().username()),infos));
},httpExecutionContext.current());
}
public CompletionStage SearchSomething(){
返回CompletableFuture.SupplySync(()->{
返回db.withConnection(
连接->{
//设想这是一个复杂的查询(以后…)
最后一个字符串sql=“选择系统用户id、角色id”
+“来自sysuser\u角色”
+“其中sysuser_id='1'”
+“以及('1','2','3','4','5')中的角色id”;
final RawSql RawSql=RawSqlBuilder.parse(sql.create();
Query Query=Ebean.find(LocationExtractedData.class);
setRawSql(rawSql);
List=query.findList();
退货清单;
});
},httpExecutionContext.current());
}
}
你能告诉我如何在同一时间运行多个优化的查询吗?我的页面充满了仪表板、图表和表格
如果我创建多个ebeanlist(查询)列表,这是否会影响页面的加载?
如果没有,我该怎么办
提前感谢,通常,在与您提供的链接类似的应用程序中,您可以按照MVC设计模式创建可重用的API。从控制器查询数据库在很大程度上违反了这种模式 每个API都应该是原子的,创建一个API来运行一个查询来获取该页面的所有数据不是正确的方法 如果您正在寻找API的性能,您应该熟悉异步编程。异步运行API将允许后端同时处理多个前端请求,从而大大提高性能