|
|
@@ -13,6 +13,7 @@ import java.util.Map;
|
|
|
import java.util.Map.Entry;
|
|
|
import java.util.Set;
|
|
|
|
|
|
+import com.mongodb.DuplicateKeyException;
|
|
|
import org.bson.types.ObjectId;
|
|
|
import org.mongodb.morphia.Datastore;
|
|
|
import org.mongodb.morphia.Key;
|
|
|
@@ -38,7 +39,7 @@ import com.uas.kanban.util.StringUtils;
|
|
|
|
|
|
/**
|
|
|
* 基本Dao操作
|
|
|
- *
|
|
|
+ *
|
|
|
* @author sunyj
|
|
|
* @since 2017年8月29日 上午10:06:32
|
|
|
*/
|
|
|
@@ -67,7 +68,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
/**
|
|
|
* Returns a new query bound to the collection (a specific
|
|
|
* {@link DBCollection})
|
|
|
- *
|
|
|
+ *
|
|
|
* @return the query
|
|
|
*/
|
|
|
public Query<T> createQuery() {
|
|
|
@@ -78,7 +79,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* 全局过滤,如有需要,可重写该方法
|
|
|
- *
|
|
|
+ *
|
|
|
* @return 过滤条件,key-value的形式
|
|
|
* <p>
|
|
|
* <b>Note</b>: Property is in the form of "name op" ("age >").
|
|
|
@@ -121,7 +122,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
/**
|
|
|
* Returns a new query bound to the collection (a specific
|
|
|
* {@link DBCollection})
|
|
|
- *
|
|
|
+ *
|
|
|
* @param code
|
|
|
* the code to query
|
|
|
* @return the query
|
|
|
@@ -132,7 +133,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* The builder for all update operations
|
|
|
- *
|
|
|
+ *
|
|
|
* @return the new UpdateOperations instance
|
|
|
*/
|
|
|
public UpdateOperations<T> createUpdateOperations() {
|
|
|
@@ -141,7 +142,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* The builder for all update operations (by the entity)
|
|
|
- *
|
|
|
+ *
|
|
|
* @param t
|
|
|
* the entity to update
|
|
|
* @return the new UpdateOperations instance
|
|
|
@@ -152,7 +153,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* The builder for all update operations (by the entity)
|
|
|
- *
|
|
|
+ *
|
|
|
* @param t
|
|
|
* the entity to update
|
|
|
* @param ignoreFields
|
|
|
@@ -199,7 +200,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* Saves an entity (Object) and updates the @Id field
|
|
|
- *
|
|
|
+ *
|
|
|
* @param t
|
|
|
* the entity to save
|
|
|
* @return the entity saved
|
|
|
@@ -212,7 +213,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* 保存 json 所指定的字段
|
|
|
- *
|
|
|
+ *
|
|
|
* @param t
|
|
|
* the entity to save
|
|
|
* @return the entity saved
|
|
|
@@ -225,7 +226,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* Saves an entity (Object) and updates the @Id field
|
|
|
- *
|
|
|
+ *
|
|
|
* @param t
|
|
|
* the entity to save
|
|
|
* @param checkFields
|
|
|
@@ -242,7 +243,12 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
if (checkFields) {
|
|
|
checkFields(t);
|
|
|
}
|
|
|
- Key<T> key = datastore.save(t);
|
|
|
+ Key<T> key;
|
|
|
+ try {
|
|
|
+ key = datastore.save(t);
|
|
|
+ } catch (DuplicateKeyException e) {
|
|
|
+ throw new IllegalStateException(processDuplicateKeyExceptionMessage(e), e);
|
|
|
+ }
|
|
|
Object id = key.getId();
|
|
|
if (id == null || !(id instanceof ObjectId)) {
|
|
|
throw new IllegalStateException("保存数据出错:id 不存在或者并非 ObjectId 类型");
|
|
|
@@ -250,12 +256,26 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
return t;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 处理 DuplicateKeyException 的消息
|
|
|
+ *
|
|
|
+ * @param e DuplicateKeyException 异常
|
|
|
+ * @return 处理后的消息
|
|
|
+ */
|
|
|
+ private String processDuplicateKeyExceptionMessage(DuplicateKeyException e){
|
|
|
+ String message = e.getMessage();
|
|
|
+ int leftIndex = message.indexOf("{");
|
|
|
+ int rightIndex = message.indexOf("}");
|
|
|
+ message = message.substring(leftIndex + 5, rightIndex - 2);
|
|
|
+ return "已存在:" + message;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 对对象的字段进行检查,包括是否为空等,主要关注 {@link FieldProperty} 注解
|
|
|
- *
|
|
|
+ *
|
|
|
* @param <K>
|
|
|
* 要检查的对象的类型,可与 {@link T} 不同
|
|
|
- *
|
|
|
+ *
|
|
|
* @param k
|
|
|
* 要检查的对象
|
|
|
* @throws IllegalArgumentException
|
|
|
@@ -320,7 +340,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* 删除所有数据
|
|
|
- *
|
|
|
+ *
|
|
|
* @return results of the delete
|
|
|
*/
|
|
|
public int deleteAll() {
|
|
|
@@ -330,7 +350,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* Delete the given entity (by code)
|
|
|
- *
|
|
|
+ *
|
|
|
* @param code
|
|
|
* the code to delete
|
|
|
* @return results of the delete
|
|
|
@@ -342,7 +362,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* Delete the given entity (by code)
|
|
|
- *
|
|
|
+ *
|
|
|
* @param codes
|
|
|
* the code to delete
|
|
|
* @return results of the delete
|
|
|
@@ -355,7 +375,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* 根据指定的条件删除数据
|
|
|
- *
|
|
|
+ *
|
|
|
* @param filters
|
|
|
* 过滤条件,key-value的形式
|
|
|
* @return results of the delete
|
|
|
@@ -368,7 +388,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* Deletes entities based on the query
|
|
|
- *
|
|
|
+ *
|
|
|
* @param query
|
|
|
* the query used to match the documents to update
|
|
|
* @return results of the delete
|
|
|
@@ -380,7 +400,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* Update the given entity (by code)
|
|
|
- *
|
|
|
+ *
|
|
|
* @param t
|
|
|
* the entity to update
|
|
|
* @return number updated
|
|
|
@@ -393,7 +413,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* Update the given entity (by code)
|
|
|
- *
|
|
|
+ *
|
|
|
* @param t
|
|
|
* the entity to update
|
|
|
* @param ignoreFields
|
|
|
@@ -412,7 +432,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* 更新 json 所指定的字段
|
|
|
- *
|
|
|
+ *
|
|
|
* @param json
|
|
|
* json格式的数据
|
|
|
* @return number updated
|
|
|
@@ -465,7 +485,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* Update the given entity (by code)
|
|
|
- *
|
|
|
+ *
|
|
|
* @param code
|
|
|
* the code to update
|
|
|
* @return number updated
|
|
|
@@ -478,7 +498,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
/**
|
|
|
* Updates all entities found with the operations; this is an atomic
|
|
|
* operation per entity
|
|
|
- *
|
|
|
+ *
|
|
|
* @param query
|
|
|
* the query used to match the documents to update
|
|
|
* @param operations
|
|
|
@@ -488,13 +508,17 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
private int update(@NotEmpty("query") Query<T> query, @NotEmpty("operations") UpdateOperations<T> operations) {
|
|
|
operations.set("lastModified", new Date());
|
|
|
operations.inc("version");
|
|
|
- UpdateResults updateResults = datastore.update(query, operations);
|
|
|
+ UpdateResults updateResults;
|
|
|
+ try{
|
|
|
+ updateResults = datastore.update(query, operations);}catch (DuplicateKeyException e) {
|
|
|
+ throw new IllegalStateException(processDuplicateKeyExceptionMessage(e), e);
|
|
|
+ }
|
|
|
return updateResults.getUpdatedCount();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Find all instances
|
|
|
- *
|
|
|
+ *
|
|
|
* @return The results
|
|
|
*/
|
|
|
public List<T> findAll() {
|
|
|
@@ -505,7 +529,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
/**
|
|
|
* Find the given entity (by code); shorthand for
|
|
|
* {@code find("code ", code)}
|
|
|
- *
|
|
|
+ *
|
|
|
* @param code
|
|
|
* the code to query
|
|
|
* @return the matched entity. may be null.
|
|
|
@@ -518,7 +542,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* Find the given entities (by code);
|
|
|
- *
|
|
|
+ *
|
|
|
* @param codes
|
|
|
* the codes to query
|
|
|
* @return the matched entities. may be null.
|
|
|
@@ -529,7 +553,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* 根据指定的 field 和值获取数据
|
|
|
- *
|
|
|
+ *
|
|
|
* @param field
|
|
|
* 指定的field
|
|
|
* @param value
|
|
|
@@ -546,7 +570,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* 根据指定的 field 和值获取数据
|
|
|
- *
|
|
|
+ *
|
|
|
* @param field
|
|
|
* 指定的field
|
|
|
* @param values
|
|
|
@@ -559,10 +583,10 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* 根据指定的 field 和值获取数据
|
|
|
- *
|
|
|
+ *
|
|
|
* @param <K>
|
|
|
* 值的类型
|
|
|
- *
|
|
|
+ *
|
|
|
* @param field
|
|
|
* 指定的field
|
|
|
* @param values
|
|
|
@@ -575,7 +599,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* 根据指定的条件查询数据
|
|
|
- *
|
|
|
+ *
|
|
|
* @param filters
|
|
|
* 过滤条件,key-value的形式
|
|
|
* @return The results
|
|
|
@@ -588,7 +612,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* Execute the query and get the results
|
|
|
- *
|
|
|
+ *
|
|
|
* @param query
|
|
|
* the query used to match the documents to update
|
|
|
* @return The results
|
|
|
@@ -604,7 +628,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* 分页获取数据
|
|
|
- *
|
|
|
+ *
|
|
|
* @param page
|
|
|
* 页码
|
|
|
* @param size
|
|
|
@@ -621,7 +645,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* 根据指定的条件分页查询数据
|
|
|
- *
|
|
|
+ *
|
|
|
* @param filters
|
|
|
* 过滤条件,key-value的形式
|
|
|
* @param page
|
|
|
@@ -641,7 +665,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* 分页查询数据
|
|
|
- *
|
|
|
+ *
|
|
|
* @param query
|
|
|
* the query used to match the documents to update
|
|
|
* @param page
|
|
|
@@ -699,7 +723,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* 解析json为指定对象
|
|
|
- *
|
|
|
+ *
|
|
|
* @param json
|
|
|
* json数据
|
|
|
* @return 解析得到的对象
|
|
|
@@ -710,7 +734,7 @@ public class BaseDao<T extends BaseEntity> {
|
|
|
|
|
|
/**
|
|
|
* 为查询增加过滤条件
|
|
|
- *
|
|
|
+ *
|
|
|
* @param query
|
|
|
* the query used to match the documents to update
|
|
|
* @param filters
|