- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我将尝试直接用代码描述我的问题,并在之后说出我需要什么,请注意,我最小化了我的代码以解决我遇到的问题:
我从实体获取提要列表:
@Entity
public class Feed {
@Id
@Column
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@ManyToOne
@JoinColumn(name = "event_id")
private Event event;
@ManyToOne
@JoinColumn(name = "event_trigger_id")
private EventTypeTrigger eventTrigger;
}
在这里,我试图让这个实体填充正确的count
值。
@Entity
public class EventTrigger {
@Id
@Column
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(nullable = false)
private String title;
@Transient
private int count;
}
存储计数数据的 Feed 实体。
@Entity
public class EventTriggerFeed {
@Id
@Column
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(nullable = false)
private int count;
@ManyToOne
@JoinColumn(name = "event_id", nullable = false)
@JsonBackReference
private Event event;
@ManyToOne
@JoinColumn(name = "event_trigger_id", nullable = false)
@JsonBackReference
private EventTrigger eventTrigger;
}
从我尝试调用的服务中:
public List<Feed> findUserFeeds(int userId) {
return Ebean.find(Feed.class).findList();
}
我可以像这样获得每个触发器的计数:
public int getCountFromEventTriggerFeed(int triggerId, int eventId) {
return Ebean.find(EventTriggerFeed.class)
.where().eq("eventTrigger.id",triggerId).eq("event.id",eventId)
.findUnique().getCount();
}
我只想获取 Feed
列表,其中包含 Event
信息和 EventTrigger
信息,并使用 count
属性填充来自 EventTriggerFeed
的计数值
我只是有点坚持完美的方式,没有那么多迭代,我正在考虑获取 Feed
行内每个 EventTrigger
的计数值,但这可能会导致我接到很多电话:
for (Feed feed : findUserFeeds(userId)) {
int eventId = feed.getEvent().getId();
int triggerId = feed.getEventTrigger().getId();
feed.getEventTrigger().setCount(getCountFromEventTriggerFeed(triggerId, eventId))
}
但是你能想象如果我有大约 50 个提要吗?
有没有关于如何优化这个令人头疼的问题的想法?
最佳答案
我通过在 .sql
文件中创建 View 解决了这个问题,如下所示:
CREATE OR REPLACE VIEW `event_feed_summary_view` AS
SELECT
max(feed.trigger_count) * up.amount AS total_amount,
feed.trigger_count,
uf.feed_id,
feed.event_id,
feed.event_trigger_id,
up.amount
FROM event_trigger_feeds feed
INNER JOIN event_type_triggers trig ON feed.event_trigger_id AND trig.id
INNER JOIN user_feed uf ON uf.event_id = feed.event_id AND uf.event_trigger_id = feed.event_trigger_id
GROUP BY uf.feed_id, feed.event_id, feed.event_trigger_id;
我将此代码放入 conf/db_views/create_views.sql
我在模块内部启动时调用了这个文件OnStartup
:
@Singleton
public class OnStartup {
@Inject
public OnStartup(final Configuration configuration, final Environment environment, Database db) {
// Create views
Logger.info("Creating / Replacing the Tables views in database");
InputStream is = environment.classLoader().getResourceAsStream("db_views/create_views.sql");
String sql;
try {
sql = IOUtils.toString(is);
if (sql != null) {
Connection conn = db.getConnection();
try {
Statement stmt = conn.createStatement();
try {
stmt.execute(sql);
Logger.info("Views Created");
} finally {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} catch (SQLException e) {
Logger.error("Could create Statement ");
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
} catch (IOException e) {
Logger.error("Could not find create view script");
e.printStackTrace();
}
}
}
使用 Ebean,我使用 SqlQuery
得到结果:
public long getTotal(int feedId) {
String sql = "select sum(total_amount) as total from event_feed_summary_view where feed_id = :feed_id;";
SqlQuery sqlQuery = Ebean.createSqlQuery(sql);
sqlQuery.setParameter("feed_id", feedId);
SqlRow r = sqlQuery.findUnique();
if (r != null && r.getLong("total") != null) {
return r.getLong("total");
}
return 0;
}
关于java - 使用Ebean,填充存储另一个相关实体属性的实体列表的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36289210/
我定义了一个没有字段的基本模型,并通过 Ebean 的 eclipse 插件对其进行了增强。然后我用java反编译器反编译,发现ebean给它添加了一些字段和方法: private static St
我有一个 wicket 应用程序,并且正在使用 Ebean ORM 映射。我已在 ebean.properties 中设置了所有凭据。但是当我将其部署到服务器上时,我收到一条错误消息“无法初始化类 c
我想实现的是:当我删除该类别时,它的所有相关文章都可以被删除,当我删除该文章时,它也可以在其相关类别中被删除。 我设置了映射关系@ManyToOne和 @OneToMany(cascade = Cas
我试图复制文档: https://www.playframework.com/documentation/2.5.x/JavaEbean 我按照文档中提到的方式设置了所有内容。 project\plu
我正在尝试进行查询,以检查用户的电子邮件或名称是否以给定的字符串开头。在 sql 查询中,我会使用 name like 'queryString%' or email like 'queryStrin
我有一个带有字段 id 、 name 、 price 等的类产品,... 我只想从表中获取名称.. 我正在使用这个查询 String sql = "select name from produc
我使用的是 Play Framework 2.3,当我尝试创建自己的 SQL 查询时,我总是遇到映射忽略问题。 我不知道是否应该使用 Ebean 来编写这个复杂的 sql 查询。 这是运行良好的 SQ
我有一个模型类,它定义了属于同一类模型的子级列表。保留一个带有一些初始子对象的新对象效果很好,但是当我有两个或更多级别的子对象时,Ebean 似乎无法很好地处理它。这似乎出乎意料,所以我担心我犯了一个
我有一个关于 Ebean 的问题。不幸的是我找不到任何文档来帮助我。我想选择值为 true 且 OneToMany 关系的所有成员也具有 true 值的所有行。 这是一个例子: @Entity pub
我有一个以下模型类。这只是为了测试。 @Entity public class Quest { public static final Find find = new Find() {};
我正在尝试在同一个实体中创建一个@OneToMany 关系。这是一个示例代码: @Entity public class Client extends Model{ private stati
我有一个表,除其他外,它有两列 Long 类型。在我的查询中,我想返回 A 列(长型)等于 B 列(长型)的行。我想在不编写原始 sql 的情况下执行此操作,而是使用更好的方法链接。 到目前为止,我一
我正在尝试在 Java Play 中使用 Ebean 2.3.3 查询部分对象!框架 2.2.1。例如,要获取仅包含 instance_config 中的 id、host 和 publicKey 字段
我在查询要在数据库中搜索自动完成功能的字符串时遇到了一个小问题,我遇到的问题是我需要第一个结果是所有以“开头”的语句,然后是包含该语句的语句字符串! 例如:如果我在数据库的表中得到以下记录: Awes
我有以下代码: @Entity public class Album extends Model { /** * Generated UID */ private
我对 Ebean 的世界是全新的Play Framework 2 中使用的 ORM 持久层。我最初的印象非常好,但在我的业余项目中,我偶然发现了我不知道如何解决的问题。我不确定我是否做错了什么(模型?
我正在尝试进行查询,以检查帐户信息是否处于 Activity 状态(boolean = True)及其针对该用户的信息(来自模型的用户 ID)。在 SQL 中我会这样写 Select * from m
我喝了一些 Gin ,我喝了一些补品,它们是多对多关系。现在我还有一张 table gin2tonic。它只有 2 个键,它们都与 tonic 和 gin 的 id 无关。 我想用匹配的补品检索所有
Ebean ORM 是 Play 的首选 ORM! Java 框架。当我在构建自己的对象关系映射器和其他对象关系行为模式以及使用 ORM 之间做出选择时,我觉得非常重要的一个标准是 Ebeans 是否
我创建了使用 Ebeans 的示例应用程序: 型号: @Entity public class Numm extends Model { @Id private long id;
我是一名优秀的程序员,十分优秀!