Eva
Java粉絲募集中
  • 簡介
  • 我們的優勢
  • 最新消息
  • 下載與使用
  • 範例與說明
    • Eva Objects >
      • Bean類別定義
      • Entity型別定義
      • Struct型別定義
      • 建立Entity空白物件
      • 建立Entity修改物件
      • 建立Entity條件物件
      • 建立Struct值物件
    • Eva_ORM >
      • ORM程式主體
      • 使用條件物件執行操作
      • 執行更複雜條件的操作.
      • 分頁取回資料
      • 操作JDBC的參數
      • Array Property的操作
      • Collection Property的操作
      • 更複雜的Collection Property
      • 指定表格名稱
      • 新增資料庫Dialect
    • Eva_IOC >
      • IOC程式主體
      • AOP應用
    • Eva_Struct >
      • Struct範例
      • Bit Strcut範例
      • 指標範例
      • 於Eva_ORM中使用
    • Eva_Sort >
      • 依指定Properties排序
      • 部份排序
      • 優先排序部份
    • Eva_Cache >
      • hashing-based cache
      • 非hashing-based cache
  • API列表
  • 技術支援
    • 協助開發
  • 相關書籍

執行更複雜條件的操作.

在下面範例中我們展示了幾種執行查詢的方法. example1 與 example2 都是透過 條件物件去查詢, 而 example2 使用了條件字串去設定條件物件, 但基本上跟 example有一樣的功能限制, 不能呼叫任何函式. 而 example3 直接將查詢字串傳入 ORMapper的相關API, 此種情況可以呼叫資料庫內提供的函式, 但值得一提的是, example3 的方式也適合用於非常短的條件, 例如以單一的Primary key 去查詢資料之時, 這樣會讓程式變得短而易懂. 

example4 則是透過 ORMapper 物件的 translate 方法, 將一混有類別與屬性名稱的類 SQL 命令, 轉換成合法的 SQL 命令, 此種做法只能使用於 非巢狀 SQL 命令 的情況. 而 example5 示範如何透過 Eva_ORM 的 API 去組合出 SQL 命令, 在 example5 中我們透過 ORMapper 的 fieldName, fieldValue, joinClause 方法去自行對映與組合出一個查詢的 SQL 命令, 此方法幾乎等於自己動手寫 SQL 命令, 雖然最冗長最麻煩, 但也有著最大的彈性, 在example6中, 則透過query方法, 從"Select * "類型的查詢中取出查詢到的Entity.
package entities;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;

import junit.framework.Assert;

import org.junit.Test;

import com.logntw.eva.anno.orm.Entity;
import com.logntw.eva.anno.orm.Id;
import com.logntw.eva.bean.condition.ConditionObj;
import com.logntw.eva.bean.condition.ConditionObjUtil;
import com.logntw.eva.condition.OP;
import com.logntw.eva.orm.DBConnectionProvider;
import com.logntw.eva.orm.EagerToGet;
import com.logntw.eva.orm.ORMapper;
import com.logntw.eva.orm.ORMappers;
import com.logntw.eva.orm.defo.DefaultTableCreator;
import com.logntw.eva.orm.defo.DefoORMappers;
import com.logntw.eva.orm.defo.conn.HSQLDB_1_8ConnectionProvider;

public class QueryExample
{
  @Entity
  public static interface X
  {  
    @Id
    int getId1();
    void setId1(int id1);
    
    Y getData2();
    void setData2(Y data2);
    
    Y getData3();
    void setData3(Y data3);
    
  }
  
  @Entity
  public static interface Y
  {  
    @Id
    int getId4();
    void setId4(int id4);
    
    Z getData5();
    void setData5(Z data5);
  }
  
  @Entity
  public static interface Z
  {  
    @Id
    int getId6();
    void setId6(int id6);
    
    String getData7();
    void setData7(String data7);
  }
  
  @Test
  public void example1() throws Exception
  {  
    DBConnectionProvider provider = new HSQLDB_1_8ConnectionProvider("dbName");    
    ORMappers mappers = DefoORMappers.getInstance(provider);
    DefaultTableCreator.create(mappers, Z.class);
    DefaultTableCreator.create(mappers, Y.class);
    DefaultTableCreator.create(mappers, X.class);
        
    mappers.open();
    
    try
    {        
      X x = mappers.newObject(X.class);
      Y y = mappers.newObject(Y.class);
      Y y2 = mappers.newObject(Y.class);
      Z z = mappers.newObject(Z.class);
      Z z2 = mappers.newObject(Z.class);
      x.setId1(1);
      
      x.setData2(y);
      y.setId4(1);
      y.setData5(z);
      z.setId6(9);
      
      x.setData3(y2);
      y2.setId4(2);
      y2.setData5(z2);
      z2.setId6(8);
      z2.setData7("AAA");
      
      mappers.insert(z,z2);
      mappers.insert(y,y2);
      mappers.insert(x);
      mappers.commit();
      
      ConditionObj<X> cx = mappers.getMapper(X.class).newCondition();
      
      ConditionObj<Y> cya = mappers.getMapper(Y.class).newCondition();
      ConditionObj<Y> cyb = mappers.getMapper(Y.class).newCondition();
      
      ConditionObj<Z> cza = mappers.getMapper(Z.class).newCondition();
      ConditionObj<Z> czb = mappers.getMapper(Z.class).newCondition();
      
      cza.If(OP.LESS).setId6(10);
      czb.If(OP.LIKE).setData7("A%");
      cya.If(OP.THAT).setData5(cza.This());
      cyb.If(OP.THAT).setData5(czb.This());
      cx.If(OP.THAT).setData2(cya.This());
      cx.If(OP.THAT).setData3(cyb.This());
      
      List<X> list = mappers.select(true, EagerToGet.ENTITY, cx);
      
      mappers.delete(true, x);
      mappers.delete(true, y,y2);
      mappers.delete(true, z,z2);  
      mappers.commit();

      
    }
    finally
    {  
      mappers.close();  
      DefaultTableCreator.drop(mappers, X.class);
      DefaultTableCreator.drop(mappers, Y.class);
      DefaultTableCreator.drop(mappers, Z.class);
    }    
  }
    
  @Test
  public void example2() throws Exception
  {  
    DBConnectionProvider provider = new HSQLDB_1_8ConnectionProvider("dbName");    
    ORMappers mappers = DefoORMappers.getInstance(provider);
    DefaultTableCreator.create(mappers, Z.class);
    DefaultTableCreator.create(mappers, Y.class);
    DefaultTableCreator.create(mappers, X.class);
    
    mappers.open();
    
    try
    {        
      X x = mappers.newObject(X.class);
      Y y = mappers.newObject(Y.class);
      Y y2 = mappers.newObject(Y.class);
      Z z = mappers.newObject(Z.class);
      Z z2 = mappers.newObject(Z.class);
      x.setId1(1);
      
      x.setData2(y);
      y.setId4(1);
      y.setData5(z);
      z.setId6(9);
      
      x.setData3(y2);
      y2.setId4(2);
      y2.setData5(z2);
      z2.setId6(8);
      z2.setData7("AAA");
      
      mappers.insert(z,z2);
      mappers.insert(y,y2);
      mappers.insert(x);
      mappers.commit();
      
      ConditionObj<X> cx = mappers.getMapper(X.class).newCondition();
      
      String conditionStr = "data2.data5.id6 < ? and data3.data5.data7 like ?";
      ConditionObjUtil.setCondition(cx, conditionStr, 10, "A%");  
      
      List<X> list = mappers.select(true, EagerToGet.ENTITY, cx);
      
      mappers.delete(true, x);
      mappers.delete(true, y,y2);
      mappers.delete(true, z,z2);  
      mappers.commit();
      
    }
    finally
    {  
      mappers.close();    
      DefaultTableCreator.drop(mappers, X.class);
      DefaultTableCreator.drop(mappers, Y.class);
      DefaultTableCreator.drop(mappers, Z.class);
    }    
  }
  
  @Test
  public void example3() throws Exception
  {  
    DBConnectionProvider provider = new HSQLDB_1_8ConnectionProvider("dbName");    
    ORMappers mappers = DefoORMappers.getInstance(provider);
    DefaultTableCreator.create(mappers, Z.class);
    DefaultTableCreator.create(mappers, Y.class);
    DefaultTableCreator.create(mappers, X.class);  
    
    ORMapper<X> mapper = mappers.getMapper(X.class);
    mappers.open();
    
    try
    {  
      X x = mappers.newObject(X.class);
      Y y = mappers.newObject(Y.class);
      Y y2 = mappers.newObject(Y.class);
      Z z = mappers.newObject(Z.class);
      Z z2 = mappers.newObject(Z.class);
      x.setId1(1);
      
      x.setData2(y);
      y.setId4(1);
      y.setData5(z);
      z.setId6(9);
      
      x.setData3(y2);
      y2.setId4(2);
      y2.setData5(z2);
      z2.setId6(8);
      z2.setData7("aaa");
      
      mappers.insert(z,z2);
      mappers.insert(y,y2);
      mappers.insert(x);
      mappers.commit();
      
      String conditionStr = " data2.data5.id6 < ? and lower(data3.data5.data7) like ?";

      List<X> list = mapper.select(EagerToGet.ENTITY, conditionStr, 10, "a%");
      
      mappers.delete(true, x);
      mappers.delete(true, y,y2);
      mappers.delete(true, z,z2);  
      mappers.commit();
      
    }
    finally
    {  
      mappers.close();  
      DefaultTableCreator.drop(mappers, X.class);
      DefaultTableCreator.drop(mappers, Y.class);
      DefaultTableCreator.drop(mappers, Z.class);
    }    
  }
  
  
  @Test
  public void example4() throws Exception
  {  
    DBConnectionProvider provider = new HSQLDB_1_8ConnectionProvider("dbName");    
    ORMappers mappers = DefoORMappers.getInstance(provider);    
    DefaultTableCreator.create(mappers, Z.class);
    DefaultTableCreator.create(mappers, Y.class);
    DefaultTableCreator.create(mappers, X.class);    
    
    ORMapper<X> mapper = mappers.getMapper(X.class);
    mappers.open();
    
    try
    {        
      String evaStmt = "Select id1 from X where data2.data5.id6 < ? and lower(data3.data5.data7) like ?";
      String sqlStmt = mapper.translate(true, evaStmt);
      PreparedStatement pstmt = mappers.currentConnection().prepareStatement(sqlStmt);
      pstmt.setInt(1, (Integer)mapper.columnValue("data2.data5.id6", 10));
      pstmt.setString(2, (String)mapper.columnValue("data3.data5.data7", "a%"));
      ResultSet reuslt = pstmt.executeQuery();      
    }
    finally
    {  
      mappers.close();    
      DefaultTableCreator.drop(mappers, X.class);
      DefaultTableCreator.drop(mappers, Y.class);
      DefaultTableCreator.drop(mappers, Z.class);
    }    
  }
  
  @Test
  public void example5() throws Exception
  {  
    DBConnectionProvider provider = new HSQLDB_1_8ConnectionProvider("dbName");    
    ORMappers mappers = DefoORMappers.getInstance(provider);
    DefaultTableCreator.create(mappers, Z.class);
    DefaultTableCreator.create(mappers, Y.class);
    DefaultTableCreator.create(mappers, X.class);
        
    ORMapper<X> mapper = mappers.getMapper(X.class);          
    mappers.open();
    
    try    
    {  
      StringBuilder sqlStmt = new StringBuilder();
      sqlStmt.append("Select ");
      sqlStmt.append(mapper.columnName("id1"));
      sqlStmt.append(" from ");
      sqlStmt.append(mapper.tableName());
      sqlStmt.append(mapper.joinClause(true, "data2.data5.id6, data3.data5.data7"));
      sqlStmt.append(" where ");
      sqlStmt.append(mapper.columnName("data2.data5.id6")).append(" < ? ");
      sqlStmt.append(" and ");
      sqlStmt.append(" lower(");
      sqlStmt.append(mapper.columnName("data3.data5.data7")).append(") like ? ");
      PreparedStatement pstmt = mappers.currentConnection().prepareStatement(sqlStmt.toString());
      pstmt.setInt(1, (Integer)mapper.columnValue("data2.data5.id6", 10));
      pstmt.setString(2, (String)mapper.columnValue("data3.data5.data7", "a%"));
      ResultSet reuslt = pstmt.executeQuery();      
    }
    finally
    {  
      mappers.close();    
      DefaultTableCreator.drop(mappers, X.class);
      DefaultTableCreator.drop(mappers, Y.class);
      DefaultTableCreator.drop(mappers, Z.class);
    }    
  }
  
  @Test
  public void example6() throws Exception
  {  
    DBConnectionProvider provider = new HSQLDB_1_8ConnectionProvider("dbName");    
    ORMappers mappers = DefoORMappers.getInstance(provider);
    DefaultTableCreator.create(mappers, Z.class);
    DefaultTableCreator.create(mappers, Y.class);
    DefaultTableCreator.create(mappers, X.class);
   
Powered by Create your own unique website with customizable templates.