• morphia基本API方法


    Datastore

    get
    根据@id返回一个实例,find()的简洁使用,查找不到结果时,返回null

    <span style="font-size:12px;">Hotel hotel = ds.get(Hotel.class, hotelId);</span>  

    Find 
        对Query的包装,可以返回Query,也支持Iterable<T> and the QueryResults interface。
           支持操作:["=", "==","!=", "<>", ">", "<", ">=", "<=", "in", "nin", "all", "size", "exists"]

    span style="font-size:12px;">Datastore ds = ...  
      
    //use in a loop  
    for(Hotel hotel : ds.find(Hotel.class, "stars >", 3))  
       print(hotel);  
      
    //get back as a list  
    List<Hotel> hotels = ds.find(Hotel.class, "stars >", 3).asList();  
      
    //sort the results  
    List<Hotel> hotels = ds.find(Hotel.class, "stars >", 3).sort("-stars").asList();  
      
    //get the first matching hotel, by querying with a limit(1)  
    Hotel gsHotel = ds.find(Hotel.class, "name", "Grand Sierra").get();  
      
    //same as  
    Hotel gsHotel = ds.find(Hotel.class, "name =", "Grand Sierra").get();</span>  

    Save     

    <span style="font-size:12px;">Hotel hotel = new Hotel();  
      
    ds.save(hotel);  
      
    //@Id field is filled in for you (after the save), if you didn't set it.  
    ObjectId id = hotel.getId();</span>  

    Delete
          方法将删除对象的基于查询的id或Entity。

    <span style="font-size:12px;">Datastore ds = ...  
    ds.delete(Hotel.class, "Grand Sierra Resort");  
    //use a query  
    ds.delete(ds.createQuery(Hotel.class).filter("pendingDelete", true));</span>  

    FindAndDelete
          删除一个对象,同时返回删除的对象,该方法会查找到第一个对象并且删除

    <span style="font-size:12px;">Hotel grandSierra = ds.findAndDelete(ds.get(Hotel.class, "Grand Sierra Resort"));</span>  

    Update
         更新用户最后一次登录时间

    <span style="font-size:12px;">public void loggedIn()  
       {  
          long now = System.currentTimeMillis();  
          Query<User> me = datastore.createQuery(User.class).field(Mapper.ID_KEY).equal(id);  
          UpdateOperations<User> ops = datastore.createUpdateOperations(User.class).set("lastLogin", now);  
          ds.update(me , ops);  
          lastLogin = now;  
       }</span>  

    ensure index and caps
         在注册实例到morphia之后,每次启动应用、管理实例或部署脚本的时候,创建index和包含的集合, 同步的
         如果系统已经存在index和包含的集合,那将不做任何操作,如果当前设置不一样,将报错写日志,但不对已存在的集合做任何操作 

    <span style="font-size:12px;">m.map(MyEntity.class);  
    ds.ensureIndexes(); //creates all defined with @Indexed  
    ds.ensureCaps(); //creates all collections for @Entity(cap=@CappedAt(...))</span>  
    Updating(On the server)
                 总之,当你通过Datesote调用update方法时就会向MongoDB服务器发送一个修改已存在数据的指令。  
    interface Datastore {  
         ...  
        
      
            /** updates all entities found with the operations*/  
            <T> UpdateResults<T> update(Query<T> query, UpdateOperations<T> ops);  
            /** updates all entities found with the operations; if nothing is found insert the update as an entity if "createIfMissing" is true*/  
            <T> UpdateResults<T> update(Query<T> query, UpdateOperations<T> ops, boolean createIfMissing);  
            /** updates the first entity found with the operations*/  
            <T> UpdateResults<T> updateFirst(Query<T> query, UpdateOperations<T> ops);  
            /** updates the first entity found with the operations; if nothing is found insert the update as an entity if "createIfMissing" is true*/  
            <T> UpdateResults<T> updateFirst(Query<T> query, UpdateOperations<T> ops, boolean createIfMissing);  
            /** updates the first entity found with the operations; if nothing is found insert the update as an entity if "createIfMissing" is true*/  
            <T> UpdateResults<T> updateFirst(Query<T> query, T entity, boolean createIfMissing);  
    }  
    public interface UpdateOperations<T> {  
            /** sets the field value */  
            UpdateOperations<T> set(String fieldExpr, Object value);  
            /** removes the field */  
            UpdateOperations<T> unset(String fieldExpr);  
      
      
            /** adds the value to an array field*/  
            UpdateOperations<T> add(String fieldExpr, Object value);  
            UpdateOperations<T> add(String fieldExpr, Object value, boolean addDups);  
            /** adds the values to an array field*/  
            UpdateOperations<T> addAll(String fieldExpr, List<?> values, boolean addDups);  
              
            /** removes the first value from the array*/  
            UpdateOperations<T> removeFirst(String fieldExpr);  
            /** removes the last value from the array*/  
            UpdateOperations<T> removeLast(String fieldExpr);  
            /** removes the value from the array field*/  
            UpdateOperations<T> removeAll(String fieldExpr, Object value);  
            /** removes the values from the array field*/  
            UpdateOperations<T> removeAll(String fieldExpr, List<?> values);  
      
      
            /** decrements the numeric field by 1*/  
            UpdateOperations<T> dec(String fieldExpr);  
            /** increments the numeric field by 1*/  
            UpdateOperations<T> inc(String fieldExpr);  
            /** increments the numeric field by value (negatives are allowed)*/  
            UpdateOperations<T> inc(String fieldExpr, Number value);  
       The Field Expression
               属性表达式是用在所有的操作上的,可以是单个的属性名,也可以是用点“.”连接的嵌套属性。在表达式中你也可以使用位置操作副($)。在属性
              表达式中没有标准,你可以使用任何在MongoDB服务端有效符号。
             
            事例初始化
                  一下所有的实例创建的连接和Morphia实例都使用的一下代码。
    Morphia morphia = new Morphia();  
    morphia.map(Hotel.class).map(Address.class);  
    Datastore datastore = morphia.createDatastore("MorphiaSampleDb");  
    Hotel hotel = new Hotel("Fairmont", 3, new Address("1 Rideau Street", "Ottawa", "K1N8S7", "Canada"));  
    datastore.save(hotel);  
    UpdateOperations<Hotel> ops;  
      
    // This query will be used in the samples to restrict the update operations to only the hotel we just created.  
    // If this was not supplied, by default the update() operates on all documents in the collection.  
    // We could use any field here but _id will be unique and mongodb by default puts an index on the _id field so this should be fast!  
    Query<Hotel> updateQuery = datastore.createQuery(Hotel.class).field("_id").equal(hotel.getId());  
      
    // The Mapper class also provides a public static of the default _id field name for us...  
    Query<Hotel> updateQuery = datastore.createQuery(Hotel.class).field(Mapper.ID_KEY).equal(hotel.getId());  

    注意: 使用的是 equal() 而不是 equals()

    @Entity("hotels")  
    public class Hotel  
    {  
       @Id  
       private ObjectId id;  
      
      
       private String name;  
       private int stars;  
      
      
       @Embedded  
       private Address address;  
      
      
       @Embedded  
       List<Integer> roomNumbers = new ArrayList<Integer>();  
      
      
       // ... getters and setters  
    }  
      
      
    @Embedded  
    public class Address  
    {  
       private String street;  
       private String city;  
       private String postalCode;  
       private String country;  
      
      
       // ... getters and setters  
    }  

    set/unset

    // 改变Hotel的name属性值  
    ops = datastore.createUpdateOperations(Hotel.class).set("name", "Fairmont Chateau Laurier");  
    datastore.update(updateQuery, ops); 
    //也可以操作嵌套文档, 改变address的city属性值
    ops = datastore.createUpdateOperations(Hotel.class).set("address.city", "Ottawa");  
    datastore.update(updateQuery, ops);  
      
    // 删除Hotel的name属性值  
    // 当下会访问Hotel时name属性为null  
    ops = datastore.createUpdateOperations(Hotel.class).unset("name");  
    datastore.update(updateQuery, ops);  
     inc/dec
              
    // 'stars'属性增长一  
    ops = datastore.createUpdateOperations(Hotel.class).inc("stars");  
    datastore.update(updateQuery, ops);  
      
    // 'stars'属性值增长4  
    ops = datastore.createUpdateOperations(Hotel.class).inc("stars", 4);  
    datastore.update(updateQuery, ops);  
      
    // 'stars'属性值减少1  
    ops = datastore.createUpdateOperations(Hotel.class).dec("stars");  // 和 .inc("stars", -1) 相同  
    datastore.update(updateQuery, ops);  
      
    // 'stars'属性值减少4  
    ops = datastore.createUpdateOperations(Hotel.class).inc("stars", -4);  
    datastore.update(updateQuery, ops);  

    add/All

    // 把一个值放入到数组中 array() (+v 0.95)   
    // same as .add("roomNumbers", 11, false)  
    ops = datastore.createUpdateOperations(Hotel.class).add("roomNumbers", 11);  
    datastore.update(updateQuery, ops); // [ 11 ]  
    ops = datastore.createUpdateOperations(Hotel.class).set("roomNumbers", 11);  
    datastore.update(updateQuery, ops);  
      
    // 由于没有rooNumbers数组将会引起错误  
    ops = datastore.createUpdateOperations(Hotel.class).add("roomNumbers", 11, false);  
    datastore.update(updateQuery, ops);  // causes error  
      
    // 删除roomNummbers属性  
    ops = datastore.createUpdateOperations(Hotel.class).unset("roomNumbers");  
    datastore.update(updateQuery, ops);  
      
    // use the 3rd parameter to add duplicates  
      
    // add to end of array, same as add()  
    ops = datastore.createUpdateOperations(Hotel.class).add("roomNumbers", 11, false);  
    datastore.update(updateQuery, ops);  // [ 11 ]  
      
    // no change since its a duplicate... doesn't cause error  
    ops = datastore.createUpdateOperations(Hotel.class).add("roomNumbers", 11, false);  
    datastore.update(updateQuery, ops);  // [ 11 ]  
      
    // push onto the end of the array  
    ops = datastore.createUpdateOperations(Hotel.class).add("roomNumbers", 12, false);  
    datastore.update(updateQuery, ops); // [ 11, 12 ]  
      
    // add even if its a duplicate  
    ops = datastore.createUpdateOperations(Hotel.class).add("roomNumbers", 11, true);  
    datastore.update(updateQuery, ops); // [ 11, 12, 11 ]  

     removeFirst/Last/All

    //given roomNumbers = [ 1, 2, 3 ]  
    ops = datastore.createUpdateOperations(Hotel.class).removeFirst("roomNumbers");  
    datastore.update(updateQuery, ops);  // [ 2, 3 ]  
      
      
    //given roomNumbers = [ 1, 2, 3 ]  
    ops = datastore.createUpdateOperations(Hotel.class).removeLast("roomNumbers");  
    datastore.update(updateQuery, ops);  // [ 1, 2 ]  
    ops = datastore.createUpdateOperations(Hotel.class).removeLast("roomNumbers");  
    datastore.update(updateQuery, ops);  // [ 1 ]  
    ops = datastore.createUpdateOperations(Hotel.class).removeLast("roomNumbers");  
    datastore.update(updateQuery, ops);  // []   empty array  
      
      
    //given roomNumbers = [ 1, 2, 3, 3 ]  
    ops = datastore.createUpdateOperations(Hotel.class).removeAll("roomNumbers", 3);  
    datastore.update(updateQuery, ops);  // [ 1, 2 ]  
      
    //given roomNumbers = [ 1, 2, 3, 3 ]  
    ops = datastore.createUpdateOperations(Hotel.class).removeAll("roomNumbers", Arrays.asList(2, 3));  
    datastore.update(updateQuery, ops);  // [ 1 ]  

    Multiple Operations

               你也可以在一个update指令中执行多个updae操作。
    //设置城市名称为Ottawa和是stars的增长1  
    ops = datastore.createUpdateOperations(Hotel.class).set("city", "Ottawa").inc("stars");  
    datastore.update(updateQuery, ops);  
      
    //如果你在同一个属性上执行多次同样的指令操作,结果将会变化,即:只有最后一次有效  
    ops = datastore.createUpdateOperations(Hotel.class).inc("stars", 50).inc("stars");  //stars只增长1  
    ops = datastore.createUpdateOperations(Hotel.class).inc("stars").inc("stars", 50);  //stars只增长50  
      
    //你不能在同一个属性上执行相矛盾的操作。  
    ops = datastore.createUpdateOperations(Hotel.class).set("stars", 1).inc("stars", 50); //引起错误  
    在默认的驱动和shell上这是默认的行为。在Morphia中我们认为修改所有的符合条件的结果是最好的默认选择(如下)。
                  {name: "Fairmont", stars: 5}, {name: "Last Chance", stars: 3}
                  
                  
    ops = datastore.createUpdateOperations(Hotel.class).inc("stars", 50);  
      
    // (+v 0.95 now takes into account the order())  
    // morphia 执行updateFirst方法仅仅执行第一个符合查询条件的数据项  
    datastore.updateFirst(datastore.find(Hotel.class).order("stars"), ops);  //仅仅修改Last Chance  
    datastore.updateFirst(datastore.find(Hotel.class).order("-stars"), ops); // 仅仅修改 Fairmont  
    [java] view plaincopy
    //default shell version is to match first  
    //shell version has a multi to indicate to update all matches, not just first  
    //to mimic morphia operation, set multi = false  
    db.collection.update( criteria, objNew, upsert, multi ); 
     createIfMissing (overload parameter)
            所有的update都被重载支持一个"createIfMissing"参数。
    ops = datastore.createUpdateOperations(Hotel.class).inc("stars", 50);  
      
    //修改, 如果没有找到就添加一个。  
    datastore.updateFirst(datastore.createQuery(Hotel.class).field("stars").greaterThan(100), ops, true);    
      
    // creates { "_id" : ObjectId("4c60629d2f1200000000161d"), "stars" : 50 }  
    //equivalent morphia shell version is... upsert = true  
    db.collection.update( criteria, objNew, true, multi );  

    DAO

    针对Mongo数据库访问,morphia提供了访问的基本的接口便于开发人员实现。

    DAO接口类:

    public interface DAO<T, K>   

    DAO底层实现类

    <span style="font-weight: normal;"><span style="font-size:12px;">package com.google.code.morphia.dao;    
        
    import java.lang.reflect.ParameterizedType;    
    import java.util.ArrayList;    
    import java.util.List;    
        
    import com.google.code.morphia.Datastore;    
    import com.google.code.morphia.DatastoreImpl;    
    import com.google.code.morphia.Key;    
    import com.google.code.morphia.Morphia;    
    import com.google.code.morphia.query.Query;    
    import com.google.code.morphia.query.QueryResults;    
    import com.google.code.morphia.query.UpdateOperations;    
    import com.google.code.morphia.query.UpdateResults;    
    import com.mongodb.DBCollection;    
    import com.mongodb.Mongo;    
    import com.mongodb.WriteConcern;    
    import com.mongodb.WriteResult;    
        
    /**  
     * @author Olafur Gauti Gudmundsson  
     * @author Scott Hernandez  
     */    
    @SuppressWarnings({ "unchecked", "rawtypes" })    
    public class BasicDAO<T, K> implements DAO<T, K> {    
            
        protected Class<T> entityClazz;    
        protected DatastoreImpl ds;    
            
        public BasicDAO(Class<T> entityClass, Mongo mongo, Morphia morphia, String dbName) {    
            initDS(mongo, morphia, dbName);    
            initType(entityClass);    
        }    
            
        public BasicDAO(Class<T> entityClass, Datastore ds) {    
            this.ds = (DatastoreImpl) ds;    
            initType(entityClass);    
        }    
            
        /**  
         * <p> Only calls this from your derived class when you explicitly declare the generic types with concrete classes </p>  
         * <p>  
         * {@code class MyDao extends DAO<MyEntity, String>}  
         * </p>  
         * */    
        protected BasicDAO(Mongo mongo, Morphia morphia, String dbName) {    
            initDS(mongo, morphia, dbName);    
            initType(((Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]));    
        }    
            
        protected BasicDAO(Datastore ds) {    
            this.ds = (DatastoreImpl) ds;    
            initType(((Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]));    
        }    
            
        protected void initType(Class<T> type) {    
            this.entityClazz = type;    
            ds.getMapper().addMappedClass(type);    
        }    
            
        protected void initDS(Mongo mon, Morphia mor, String db) {    
            ds = new DatastoreImpl(mor, mon, db);    
        }    
            
        /**  
         * Converts from a List<Key> to their id values  
         *   
         * @param keys  
         * @return  
         */    
        protected List<?> keysToIds(List<Key<T>> keys) {    
            ArrayList ids = new ArrayList(keys.size() * 2);    
            for (Key<T> key : keys)    
                ids.add(key.getId());    
            return ids;    
        }    
            
        /** The underlying collection for this DAO */    
        public DBCollection getCollection() {    
            return ds.getCollection(entityClazz);    
        }    
        
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#createQuery()  
         */    
        public Query<T> createQuery() {    
            return ds.createQuery(entityClazz);    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#createUpdateOperations()  
         */    
        public UpdateOperations<T> createUpdateOperations() {    
            return ds.createUpdateOperations(entityClazz);    
        }    
        
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#getEntityClass()  
         */    
        public Class<T> getEntityClass() {    
            return entityClazz;    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#save(T)  
         */    
        public Key<T> save(T entity) {    
            return ds.save(entity);    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#save(T, com.mongodb.WriteConcern)  
         */    
        public Key<T> save(T entity, WriteConcern wc) {    
            return ds.save(entity, wc);    
        }    
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#updateFirst(com.google.code.morphia.query.Query, com.google.code.morphia.query.UpdateOperations)  
         */    
        public UpdateResults<T> updateFirst(Query<T> q, UpdateOperations<T> ops) {    
            return ds.updateFirst(q, ops);    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#update(com.google.code.morphia.query.Query, com.google.code.morphia.query.UpdateOperations)  
         */    
        public UpdateResults<T> update(Query<T> q, UpdateOperations<T> ops) {    
            return ds.update(q, ops);    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#delete(T)  
         */    
        public WriteResult delete(T entity) {    
            return ds.delete(entity);    
        }    
        
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#delete(T, com.mongodb.WriteConcern)  
         */    
        public WriteResult delete(T entity, WriteConcern wc) {    
            return ds.delete(entity, wc);    
        }    
        
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#deleteById(K)  
         */    
        public WriteResult deleteById(K id) {    
            return ds.delete(entityClazz, id);    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#deleteByQuery(com.google.code.morphia.query.Query)  
         */    
        public WriteResult deleteByQuery(Query<T> q) {    
            return ds.delete(q);    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#get(K)  
         */    
        public T get(K id) {    
            return ds.get(entityClazz, id);    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#findIds(java.lang.String, java.lang.Object)  
         */    
        public List<T> findIds(String key, Object value) {    
            return (List<T>) keysToIds(ds.find(entityClazz, key, value).asKeyList());    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#findIds()  
         */    
        public List<T> findIds() {    
            return (List<T>) keysToIds(ds.find(entityClazz).asKeyList());    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#findIds(com.google.code.morphia.query.Query)  
         */    
        public List<T> findIds(Query<T> q) {    
            return (List<T>) keysToIds(q.asKeyList());    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#exists(java.lang.String, java.lang.Object)  
         */    
        public boolean exists(String key, Object value) {    
            return exists(ds.find(entityClazz, key, value));    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#exists(com.google.code.morphia.query.Query)  
         */    
        public boolean exists(Query<T> q) {    
            return ds.getCount(q) > 0;    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#count()  
         */    
        public long count() {    
            return ds.getCount(entityClazz);    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#count(java.lang.String, java.lang.Object)  
         */    
        public long count(String key, Object value) {    
            return count(ds.find(entityClazz, key, value));    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#count(com.google.code.morphia.query.Query)  
         */    
        public long count(Query<T> q) {    
            return ds.getCount(q);    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#findOne(java.lang.String, java.lang.Object)  
         */    
        public T findOne(String key, Object value) {    
            return ds.find(entityClazz, key, value).get();    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#findOne(com.google.code.morphia.query.Query)  
         */    
        public T findOne(Query<T> q) {    
            return q.get();    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#find()  
         */    
        public QueryResults<T> find() {    
            return createQuery();    
        }    
            
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#find(com.google.code.morphia.query.Query)  
         */    
        public QueryResults<T> find(Query<T> q) {    
            return q;    
        }    
        
        /* (non-Javadoc)  
         * @see com.google.code.morphia.DAO#getDatastore()  
         */    
        public Datastore getDatastore() {    
            return ds;    
        }    
            
        public void ensureIndexes() {    
            ds.ensureIndexes(entityClazz);    
        }    
        
    }  </span></span>  

    使用DAO如下:

    <span style="font-weight: normal;"><span style="font-size:12px;">package com.easyway.mongodb.morphia;    
        
    import java.util.List;    
        
    import com.easyway.mongodb.morphia.basic.Hotel;    
    import com.google.code.morphia.Morphia;    
    import com.google.code.morphia.dao.BasicDAO;    
    import com.google.code.morphia.query.UpdateOperations;    
    import com.mongodb.Mongo;    
    /**  
     * 数据访问层类的使用  
     */    
    public class HotelDAO  extends BasicDAO<Hotel, String> {    
         public HotelDAO(Morphia morphia, Mongo mongo, String dbName) {    
            super(mongo, morphia, dbName);    
         }    
        /**  
         * 统计四星级以上酒店数量  
         * @return  
         */    
         public long countHotel(){    
                return count(createQuery().field("stars").greaterThanOrEq(4));    
         }    
         /**  
          * 查询酒店  
          * @return  
          */    
         public List<Hotel> queryHotelPhone(){    
             return createQuery().field("phoneNumbers").sizeEq(1).asList();    
         }    
            
         /**  
          * 查询酒店  
          * @param hotel  
          */    
         public List<Hotel> queryHotel(Hotel hotel){    
             return find(createQuery().filter("stars", 4).order("address.address_street")).asList();     
         }    
         /**  
          * 修改酒店信息  
          * @param hotel  
          */    
         public void batchUpdateHotel(){    
                UpdateOperations<Hotel> mods = createUpdateOperations().inc("stars", 1);    
                update(createQuery().filter("stars", 4), mods);    
         }    
    }  </span></span>  

    Query


    该接口能够过滤查询条件、排序和位移,设置查询结果数量。实现了QueryResults 接口。
    Filter  
    Query q = ds.createQuery(MyEntity.class).filter("foo >", 12);  
    [java] view plaincopy
    Query q = ds.createQuery(MyEntity.class).filter("foo >", 12).filter("foo <", 30); 
    Fluent Interface
          filter的方法操作,field(name)后面接条件
    Query q = ds.createQuery(MyEntity.class).field("foo").equal(1);  
      
    q.field("bar").greaterThan(12);  
    q.field("bar").lessThan(40);
    Validation(验证) 
        验证 属性名和数据类型
         如果在查询中使用的属性名在指定的java类中没有找到将会抛出一个异常。如果一个属性名被“.”标识连接,那么这个表达式的每个部分都将会在指定的java对象中进行验证(有一个异常Map来记录那个属性 名被跳过)。
         数据类型问题(比较属性类型和参数类型)作为警告被记录,由于服务器可能会把数据强制转换,或者你发送意思不那么的有意义;服务器使用字节表示一些参数,所以有些类型不同的数值也可以匹配(例如数字)。

    Disabling validation(是验证无效)
              通过调用disableValidation()可以使验证变为无效,在开始等于查询或每个查询语句上。
    Datastore ds = ...  
    Query q = ds.createQuery(MyEntity.class).disableValidation();  
    //or it can be disabled for just one filter  
    Query q = ds.createQuery(MyEntity.class).disableValidation().filter("someOldField", value).enableValidation().filter("realField", otherVal);  
    Sort(排序)

                    你可以通过一个或多个属性名对结果进行升序或降序排序

    Datastore ds = ...    
    Query q = ds.createQuery(MyEntity.class).filter("foo >", 12).order("dateAdded");    
    ... // desc order    
    Query q = ds.createQuery(MyEntity.class).filter("foo >", 12).order("-dateAdded");    
    ... // asc dateAdded, desc foo    
    Query q = ds.createQuery(MyEntity.class).filter("foo >", 12).order("dateAdded, -foo");    
    Limit

    Limit

    <span style="font-size: 12px; ">Query q = ds.createQuery(MyEntity.class).filter("foo >", 12).limit(100);</span>  
  • 相关阅读:
    简单事务使用
    sql in(1,2,3)参数化查询,错误在将 varchar 值 '1,2,3,4' 转换成数据类型 int 时失败
    处理金额小数点后的零
    json时间格式化问题
    读取接口XML和批量导入数据SqlBulkCopy
    list操作 foreach和for的区别
    10.16 一起去修仙 !mv
    10.9 自动生成计算题输入答案判断正误;计算BMI
    9.25九道题
    9.18作业 杨月(1636050091)练习题
  • 原文地址:https://www.cnblogs.com/ss561/p/4682477.html
Copyright © 2020-2023  润新知