Grails


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。
















Domain > constraints > validator
>Custom
  name()
  motherName (validator: {val, obj ->
     if(val.size() < 1 && obj.name.size() < 1)
       return ['validator.message']
     })



Service > Criteria

 Service
   @Transactional(readOnly = true)
   def searchCriteria(params) {
       def m_itemCriteria = M_item.createCriteria()
       List results = m_itemCriteria.list() {
           if(params?.name) {
               eq("name", params.name)
           }
           maxResults(10)
           order("name", "desc")
       }
   }

 Controller
   def find() {
       List results = m_itemService.searchCriteria(params)
       render(view:'list', model:[m_itemInstanceList:results, m_itemInstanceTotal: results.size()])
   }

 ※Sample
def testCriteria = test.createCriteria()
List results = testCriteria .list(max:10, offset:0) {
    eq("name", params.name)
    and {
        between("balance", 500, 1000)
        eq("branch", "London")
    }
    ilike("name","%${params.name}%")
    between("balance", 500, 1000)
    eq("branch", "London")
    or {
        like("holderFirstName", "Fred%")
        like("holderFirstName", "Barney%")
    }
    maxResults(10)
    firstResult(50)
    order("holderLastName", "desc")
}
//println "Accounts of ${results.totalCount}"
//println "Rendering ${results.size()}"
render(view:'list', model:[testInstanceList:results, testInstanceTotal: results.size()])


Enum

Enum

package gapp

enum GenderEnum {

    MALE('Male','msg.male.lavel'),
    FEMALE('Female','msg.female.lavel'),
    TRANCE('Trance','msg.trance.lavel')

    private final String val
    private final String msg
    public GenderEnum(String val, String msg) {
        this.val = val
        this.msg = msg
    }

    String value() { return val }
    String msg() { return msg }
}

Domain

GenderEnum gender

static mapping = {
	version false
}

View

<g:select name="action" 
    from="${com.domain.ActionEnum?.values()}"
   	keys="${com.domain.ActionEnum.values()*.name()}" required="" 
   	value="${xyzInstance?.action?.name()}"/>
   	 
  	<g:select optionKey='id' name="action" 
   	from="${com.domain.ActionEnum?.values()}" 
   	required="" 
   	value="${xyzInstance?.action}"/>


Domain

//複合PK
static mapping = { 
	id composite:['holdYear', 'member'] 
}

//
String toString(){
	return name
}

//db mapping
static mapping = {
	table 'some_other_table_name'
	columns {
		name column:'airline_name'
		url column:'link'
		frequentFlyer column:'ff_id'
	}
}

テーブルに格納されないドメイン・クラスのフィールドを設定するには、静的 transients 行を追加
static transients = ["tempField1", "tempField2"]

Car car
static embedded = {'car'}
static mapping = {
	songs cascade: 'delete'
	discriminator 'xxxxx'
	discriminator value: '42', type: 'integer'
	tablePerHierarchy false
}

 コンボ・ボックス主キー表示時の漏えい回避
 String toString(){
   return name
 }

   //id to String
   
   String id
   static mapping = {
       table "m_item"
       id column: 'jan_code', generator: 'assigned'
   }
   
   M_item m_item
   static mapping = {
       m_item column: 'jan_code'
   }


Pagenateページ番号非表示化
<style>
 <!--
 .pagination .step, .pagination .currentStep {
   display : none ;
 }
 -->
</style>

java.util.List表示
controller
def list() {
List<NewClass> results2 = new ArrayList<NewClass>()
NewClass m_item2 = new NewClass()
m_item2.setName("java1")
results2.add(m_item2)
NewClass m_item3 = new NewClass()
m_item3.setName("java2")
results2.add(m_item3)
render(view:'list'm_itemInstanceList2:results2, m_itemInstanceTotal: results.size()])
}
gsp
<g:each in="${m_itemInstanceList2}" status="j" var="m_itemInstance2">
<tr class="${(j % 2) == 0 ? 'even' : 'odd'}">
	<td>${j+1}</td>
	<%--<td><c:out value="${m_itemInstance2.name}"/></td>--%>
	<td>${m_itemInstance2.getName()}</td>
</tr>
</g:each>



CloudFoundary

環境


Cloud Foundryプラグインのインストール
grails install-plugin cloud-foundry

grails-app/conf/Config.groovy修正

例)
grails.plugin.cloudfoundry.username アカウント用のユーザ名/メールアドレス なし(必須)
grails.plugin.cloudfoundry.password アカウント用のパスワード なし(必須)
grails.plugin.cloudfoundry.target APIサーバ名 'api.cloudfoundry.com'
grails.plugin.cloudfoundry.appname アプリケーション名 Grailsアプリケーションの名前
grails.plugin.cloudfoundry.showStackTrace コンソールにスタックトレースを表示するかどうか false
grails.plugin.cloudfoundry.testStartWithGet GETリクエストで開始や再起動をテストするかどうか true
grails.plugin.cloudfoundry.testStartGetUrl 上記プロパティがtrueの場合に使用するURL アプリケーションのURL
grails.plugin.cloudfoundry.datasource.disableTimeoutAutoconfiguration MySQLデータソースのコネクションタイムアウトチェックの自動設定を無効にするかどうか true

grails.plugin.cloudfoundry.username=
grails.plugin.cloudfoundry.password=
grails.plugin.cloudfoundry.target='api.cloudfoundry.com'
grails.plugin.cloudfoundry.appname=gapp
grails.plugin.cloudfoundry.showStackTrace=false
grails.plugin.cloudfoundry.testStartWithGet=true
grails.plugin.cloudfoundry.testStartGetUrl=gapp
grails.plugin.cloudfoundry.datasource.disableTimeoutAutoconfiguration=true


BuildConfig.groovy追記
mavenRepo "http://maven.springframework.org/milestone/"
compile "cloudfoundry:1.2.3"

grails refresh-dependencies
grails dependencies-report
w3m target/dependencies-report/index.html


コマンド


アプリのデプロイ
grails prod cf-push

アプリのアップデート
grails prod cf-update

インスタンス数変更
grails cf-show-instances
grails cf-update-instances 2

メモリ割り当て変更
grails cf-stats
grails cf-update-memory 1G

ログの確認
grails cf-logs

アプリケーションの起動・停止・再起動
grails prod cf-start
grails prod cf-stop
grails prod cf-restart

リモートファイル確認
grails cf-list-files/
grails cf-get-file logs/stderr.log

アプリケーションの削除
grails cf-delete-app

全アプリケーションの削除
grails cf-delete-all-apps

データのインポート
cf-tunnel