我希望在数据库中拥有类的模板对象,并且这些对象的客户端拥有/更改这些对象,这些对象都存储在数据库中。要做到这一点,我可以找出3个选项。
Datastore.save(..)
写入数据库,似乎集合名称是由类名选择的。我可以在班级改变这一点,但这仍然意味着我不能为这个班级创建2个不同的集合。ownerId
引用字段来指定对象是模板。但是,拥有对象的集合将快速增长,并且需要经常访问模板,因此这会产生开销。似乎有AdvancedDatastore
,我没有使用它,但似乎有AdvancedDatastore.save(String collection, T entity)
。但是,它没有像更新,删除和许多其他方法那样的签名。所以我不确定如何在我的场景中正确使用它。
答案 0 :(得分:0)
我将SELECT TOP 10 * FROM (
SELECT e.EmployeeId, COUNT(*) AS SalesCount
FROM Employees e
LEFT OUTER JOIN Orders o ON o.EmployeeId=e.EmployeeId
AND DATEPART(year, o.OrderDate)=1997
GROUP BY e.EmployeeId
) groups
ORDER BY SalesCount DESC
实施迁移到自定义Datastore
实现,我可以使用BasisDAO
提供集合名称。这是它的样子:
AdvancedDatastore
使用这个类我可以为同一个类创建多个集合。
修改强>
问题是,如果您使用未被覆盖的基类中的方法,它将在默认集合中工作(默认情况下为类名)。由于似乎没有支持集合名称的DAO,我认为从头开始用public class UserDAO extends BasicDAO<User, String> {
private final String collectionName;
public UserDAO(MongoClient mongoClient, Morphia morphia, String dbName, String collectionName) {
super(mongoClient, morphia, dbName);
this.collectionName = collectionName;
}
@Override
public Key<User> save(User entity) {
return ((AdvancedDatastore)getDatastore()).save(collectionName, entity);
}
@Override
public WriteResult delete(User entity) {
return ((AdvancedDatastore)getDatastore()).delete(collectionName, User.class, entity.getId());
}
public User getByName(String userName) {
return ((AdvancedDatastore)getDatastore()).createQuery(collectionName, User.class).field("name").equal(userName).get();
}
}
滚动自己的DAO会更好。您可以实现DAO界面,并在您需要合同或完整功能时自行编写所有方法。