在 Play Framework 中使用 WHERE 子句返回 List<Type>

Posted

技术标签:

【中文标题】在 Play Framework 中使用 WHERE 子句返回 List<Type>【英文标题】:Return List<Type> using WHERE clause in Play Framework 【发布时间】:2015-10-23 08:05:49 【问题描述】:

我只想检索 virtualfile 等于我的 virtualfile_id

的记录(使用 Ebean 保留)

在http://localhost:9000/transactionRecords路线上我有几条记录:

["id":1,"virtualfile":"1","record_type":"D","transaction_type":"MA","card_number":"0000122000200123456","expiry_date":"0000",
"id":2,"virtualfile":"1","record_type":"D","transaction_type":"MA","card_number":"0000122000200123456","expiry_date":"0000",
"id":3,"virtualfile":"1","record_type":"D","transaction_type":"MA","card_number":"0000122000200123456","expiry_date":"0000",
"id":4,"virtualfile":"1","record_type":"D","transaction_type":"MA","card_number":"0000122000200123456","expiry_date":"0000",
"id":5,"virtualfile":"1","record_type":"D","transaction_type":"MA","card_number":"0000122000200123456","expiry_date":"0000"]

我到 GET 他们的路线:

GET     /generator/:id             controllers.Application.generateFile(id: String)

我的控制器方法来获取它们:

public Result generateFile(String virtualfile_id) 
    List<TransactionRecord> transactionRecords = TransactionRecord.find.where()
            .ilike("virtualfile", "1") //set to "1" for testing
            .orderBy("id asc")
            .findPagedList(1, 25)
            .getList();
    return ok(toJson(transactionRecords));

*https://www.playframework.com/documentation/2.4.x/JavaEbean建议的获取列表的方法

还有我的 TransactionRecord.class

@Entity
public class TransactionRecord extends Model 

  @Id
  Long id;
  String virtualfile;
  String record_type;
  String transaction_type;
  String card_number;
  String expiry_date;

  public static Finder<Long,TransactionRecord> find = new Finder<>(Long.class,TransactionRecord.class);

  public TransactionRecord(String virtualfile, String transaction_type, String card_number, String expiry_date) 
      this.virtualfile = virtualfile;
      this.record_type = "D";
      this.transaction_type = transaction_type;
      this.card_number = card_number;
      this.expiry_date = expiry_date;
  

  getters & setters


但是我在路由 http://localhost:9000/generator/1 上的输出是空的 :( :

编辑:

如果我只将.iLike 更改为.eq,则不会发生任何事情。

.ilike 更改为.eq 并删除.findPagedList 的结果:

【问题讨论】:

如果您将ilike 更改为eq 和/或删除findPagedList,会发生什么情况? @SteveChaloner 我用结果更新了我的问题。 getList 更改为findList 它有效@SteveChaloner,非常感谢! :) @SteveChaloner 多么美好的幸福结局 :) 【参考方案1】:

您有 5 条记录,但在调用 getPagedList 时,您跳过了前 25 条记录。因此,您将跳过所有记录。

来自Ebean documentation

参数: pageIndex - 页面的从零开始的索引。 pageSize - 每页返回的 bean 数量。

所以,最初您需要将 findPagedList 1 的参数更改为 0

public Result generateFile(String virtualfile_id) 
    List<TransactionRecord> transactionRecords = TransactionRecord.find.where()
        .ilike("virtualfile", "1") //set to "1" for testing
        .orderBy("id asc")
        .findPagedList(0, 25)
        .getList();
    return ok(toJson(transactionRecords));

要正确支持客户端指导的分页(或者至少来自控制器层),您需要更改

的签名
public Result generateFile(String virtualfile_id)

public Result generateFile(String virtualfile_id, int page)

并使用 page 参数作为 findPagedList 的参数。

public Result generateFile(String virtualfile_id,
                           int page) 
    List<TransactionRecord> transactionRecords = TransactionRecord.find.where()
        .ilike("virtualfile", "1") //set to "1" for testing
        .order().asc("id")
        .findPagedList(page, 25)
        .getList();
    return ok(toJson(transactionRecords));

【讨论】:

以上是关于在 Play Framework 中使用 WHERE 子句返回 List<Type>的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework 路由中的变量

如何在 Play!Framework WebSockets ("wss://") 中使用 TLS

Play Framework:如何不查看文件夹以了解 Play Framework 中的更改

Play Framework 2.0 中公共字段的使用

如何使用 Play Framework 显示 SQL?

在 Play Framework 2.3.8 中使用 SORM