/** * */ package org.howsun.dao.mongodb; import java.io.Serializable; import java.util.Arrays; import java.util.Date; import java.util.List; import javax.annotation.Resource; import javax.inject.Named; import org.howsun.core.exception.DaoException; import org.howsun.dao.ExtendExecutant; import org.howsun.dao.GenericDao; import org.howsun.dao.OrderBean; import org.howsun.dao.page.Page; import org.howsun.util.Sets; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.query.BasicQuery; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import static org.springframework.data.mongodb.core.query.Criteria.*; import com.mongodb.CommandResult; import com.mongodb.WriteResult; /** * @author howsun * */ @Named("mongoGenericDao") public class MongoGenericDao implements GenericDao { @Resource protected MongoOperations operations; @Override public void save(Object object) { operations.save(object); } @Override public void update(Object object) { /*Query query = Query.query(Criteria.where("")); operations.updateFirst(query, update, entityClass) */ } @Override public <T> int update(Class<T> entityClass, String[] fields, Object[] fieldValues, Serializable id) { WriteResult result = operations.updateFirst(new Query(where("_id").is(id)), setFieldValue(fields, fieldValues), entityClass); CommandResult commandResult = result.getLastError(); if(commandResult.ok()){ return 1; } throw new DaoException(commandResult.getErrorMessage()); } public static Update setFieldValue( String[] fields, Object[] fieldValues){ Update update = new Update(); for (int i = 0; i < fieldValues.length; i++) { update.set(fields[i], fieldValues[i]); } return update; } @Override public <T> int updateByBatch(Class<T> entityName, String fields, String condition, Object[] values) { // TODO Auto-generated method stub return 0; } @Override public void merge(Object object) { // TODO Auto-generated method stub } @Override public int delete(Object object) { operations.remove(object); return 1; } @Override public <T> int delete(Class<T> entityClass, Serializable... entityids) { operations.remove(Query.query(Criteria.where("_id").in(Arrays.asList(entityids))), entityClass); return entityids.length; } @Override public <T> int delete(Class<T> entityClass, String condition, Object[] params) { // TODO Auto-generated method stub return 0; } @Override public <T> T find(Class<T> entityClass, Serializable entityid) { return operations.findById(entityid, entityClass); } @Override @Deprecated public <T> T findByXQL(Class<T> entityClass, String condition, Object[] params) { throw new DaoException("此方法不适用"); } @Override @Deprecated public <T> T findBySQL(String sql, Object[] params) { throw new DaoException("此方法不适用"); } /* * (non-Javadoc) * @see org.howsun.dao.GenericDao#finds(java.lang.Class, java.lang.String, org.howsun.dao.page.Page, java.lang.String, java.lang.Object[], org.howsun.dao.OrderBean) * condition: * a=? and b=? and c=? * a=?,b=?,c=? * a,b,c * */ @Override public <T> List<T> finds(Class<T> entityClass, String fields, Page page, String condition, Object[] params, OrderBean order) { // TODO Auto-generated method stub return null; } @Override @Deprecated public void clear() { throw new DaoException("此方法不适用"); } @Override @Deprecated public void flush() { throw new DaoException("此方法不适用"); } @Override public <T> List<T> finds(Class<T> entityClass, Page page, String condition, Object[] params, OrderBean order) { // TODO Auto-generated method stub return null; } @Override public <T> List<T> finds(Class<T> entityClass, Page page, String condition, Object[] params) { // TODO Auto-generated method stub return null; } @Override public <T> List<T> finds(Class<T> entityClass, Page page, OrderBean order) { // TODO Auto-generated method stub return null; } @Override public <T> List<T> finds(Class<T> entityClass, Page page) { return null; } @Override public <T> List<T> finds(Class<T> entityClass, OrderBean order) { // TODO Auto-generated method stub return null; } @Override public <T> List<T> finds(Class<T> entityClass) { // TODO Auto-generated method stub return null; } @Override @Deprecated public List<?> findsByXQL(String xql, Page page, Object[] params) { // TODO Auto-generated method stub return null; } @Override @Deprecated public List<?> findsBySQL(String sql, Page page, Object[] params) { // TODO Auto-generated method stub return null; } @Override @Deprecated public List<?> findsBySQL(String sql, Object[] params) { // TODO Auto-generated method stub return null; } @Override public <T> long getCount(Class<T> entityClass) { return operations.count(null, entityClass); } @Override public <T> long getCount(Class<T> entityClass, String condition, Object[] params) { return 0; } @Override public Long nextId(Class<?> entityClass) { // TODO Auto-generated method stub return null; } @Override public <T> void increaseFieldValue(Class<T> entityName, String field, Integer defaultValue, Serializable id) { Query query = Query.query(Criteria.where("_id").is(id)); Update update = new Update(); update.inc(field, defaultValue); operations.updateFirst(query, update, entityName); } @Override public void execute(ExtendExecutant extendExecutant) { extendExecutant.executing(operations); } /** * e.g.: * Query query = parseQuery("{'tracks.name' : 'Wheels'}"); * Query query = parseQuery("{'_id' : { '$oid' : '%s' }}", bigWhiskey.getId()); * Query query = parseQuery("{'tracks.name' : 'Wheels'}"); * Query query = parseQuery("{'tracks.name' : { '$regex' : '.*it.*' , '$options' : '' }}"); * Query build = new Query(where("_id").is(bigWhiskey.getId())); * * @param query * @param arguments * @return */ public static Query parseQuery(String query, Object... arguments) { return new BasicQuery(String.format(query, arguments)); } public MongoOperations getOperations() { return operations; } public void setOperations(MongoOperations operations) { this.operations = operations; } }