0

mysqlに接続する次のコードがあります。エラー メッセージを表示するデータセットの findAll メソッド。

コード:

def people = sql.dataSet("PERSON")
people.add( firstname:"James", lastname:"Strachan", id:1, location_id:10, location_name:'London' )
people.add( firstname:"Bob", lastname:"Mcwhirter", id:2, location_id:20, location_name:'Atlanta' )
people.add( firstname:"Sam", lastname:"Pullara", id:3, location_id:30, location_name:'California' )

def janFrequentBuyers = people.findAll { it.location_id > 10 && it.lastname == "Pullara" }.sql
println janFrequentBuyers

エラーメッセージ:

Caught: groovy.lang.GroovyRuntimeException: DataSet unable to evaluate expression. AST not available for closure: testdb_closure7. Is the source code on the classpath?

このエラーを修正するのを手伝ってください。

MySQLを使用しているサンプルコードは次のとおりです。

static main(args) {
    def sql = Sql.newInstance(url, username, password, driverClassName)
    try {
        sql.execute("drop table PERSON")
    } catch (Exception e) {}
    // create table
    sql.execute('''create table PERSON (
                    id integer not null primary key,
                    firstname varchar(20),
                    lastname varchar(20),
                    location_id integer,
                    location_name varchar(30)
               )''')
    // now let's populate the table
    def people = sql.dataSet("PERSON")
    people.add(firstname: "James", lastname: "Strachan", id: 1, location_id: 10, location_name: 'London')
    people.add(firstname: "Bob", lastname: "Mcwhirter", id: 2, location_id: 20, location_name: 'Atlanta')
    people.add(firstname: "Sam", lastname: "Pullara", id: 3, location_id: 30, location_name: 'California')
    //get first now
    def results = sql.firstRow("select firstname, lastname from PERSON where id=1").firstname
    println results

    //query using where class
    def janFrequentBuyers = people.findAll { it.location_id > 10 && it.lastname == "Pullara" }
    println janFrequentBuyers.each { println it }

}

エラーメッセージ:

 groovy -cp ./mysql-connector-java-5.1.14-bin.jar j.gy
James
Caught: groovy.lang.GroovyRuntimeException: DataSet unable to evaluate expression. AST not available for closure: testdb$_main_closure1. Is the source code on the classpath?
groovy.lang.GroovyRuntimeException: DataSet unable to evaluate expression. AST not available for closure: testdb$_main_closure1. Is the source code on the classpath?
        at testdb.main(j.gy:36)

h2 DB に変更しましたが、同じエラーが発生します。

 groovy db.gy
Caught: groovy.lang.GroovyRuntimeException: DataSet unable to evaluate expression. AST not available for closure: db$_run_closure1. Is the source code on the classpath?
groovy.lang.GroovyRuntimeException: DataSet unable to evaluate expression. AST not available for closure: db$_run_closure1. Is the source code on the classpath?
        at db.run(db.gy:19)

コード:

@GrabConfig(systemClassLoader=true)
@Grab(group='com.h2database', module='h2', version='1.3.168')
import groovy.sql.Sql
def sql = Sql.newInstance("jdbc:h2:mem:db1", "sa", "sa", "org.h2.Driver")
sql.execute('''create table PERSON (
                id integer not null primary key,
                firstname varchar(20),
                lastname varchar(20),
                location_id integer,
                location_name varchar(30)
           )''')
// now let's populate the table
def people = sql.dataSet("PERSON")
people.add(firstname: "James", lastname: "Strachan", id: 1, location_id: 10, location_name: 'London')
people.add(firstname: "Bob", lastname: "Mcwhirter", id: 2, location_id: 20, location_name: 'Atlanta')
people.add(firstname: "Sam", lastname: "Pullara", id: 3, location_id: 30, location_name: 'California')
//query using where class
def janFrequentBuyers = people.findAll { it.location_id > 10 && it.lastname == "Pullara"}
janFrequentBuyers.each{println it}
println "Sort on First Name"
people.sort{it.firstName}.each{println it}

使用している groovy のバージョンを確認するのを忘れていませんか?

 groovy -version
Groovy Version: 2.1.2 JVM: 1.6.0_24 Vendor: Sun Microsystems Inc. OS: Linux
4

1 に答える 1

1

DataSetの Groovy ソースは、クラスパス上にある必要があります。API の例の後の抜粋を参照してください。

ソースをクラスパスに追加する方法については、この質問に従ってください。

サンプル:-

//Add ojdbc14.jar to groovy classpath for the script
>groovy -cp C:\Oracle\11gR2\jdbc\lib\ojdbc14 DataSetTest.groovy

//DataSetTest.groovy
import groovy.sql.Sql
def db = [url:'jdbc:oracle:thin:@myoradb:1521:myoradb', user:'johndoe',
          password:'anything', driver:'oracle.jdbc.driver.OracleDriver']
def sql = Sql.newInstance(db.url, db.user, db.password, db.driver)

def airport = sql.dataSet("AIRPORT")
def cmh = airport.findAll{it.airportid == "KCMH"}

println cmh.sql

//Prints
select * from AIRPORT where airportid = ?

更新[Groovy 2.1.4]

最初のアプローチ
ソースをクラスパスに入れることで、あなたが使用したのと同じサンプルをテストしましたが、それは私にとって魅力のように機能します。次の手順:

  • MySql Server 5.6.12 をゼロからインストールしました。
  • mysql-connector-java-5.1.14使用せずに手動でダウンロード@Grab
  • mysql-connector-java-5.1.14-bin.jarクラスパスに追加されました。
  • あなたのスクリプトをコピーし(私は持っていないことに注意してくださいstatic main(args))、スクリプトを実行しました。

詳細

import groovy.sql.Sql

def dbUrl = 'jdbc:mysql://localhost:3306/stackoverflowdb'
def dbUser = 'root'
def dbPassword = ''
def driverClass = 'com.mysql.jdbc.Driver'

def sql = Sql.newInstance(dbUrl, dbUser, dbPassword, driverClass)

try {
    sql.execute("drop table PERSON")
} catch (Exception e) {}
// create table
sql.execute('''create table PERSON (
                id integer not null primary key,
                firstname varchar(20),
                lastname varchar(20),
                location_id integer,
                location_name varchar(30)
           )''')
// now let's populate the table
def people = sql.dataSet("PERSON")
people.add(firstname: "James", lastname: "Strachan", id: 1, location_id: 10, location_name: 'London')
people.add(firstname: "Bob", lastname: "Mcwhirter", id: 2, location_id: 20, location_name: 'Atlanta')
people.add(firstname: "Sam", lastname: "Pullara", id: 3, location_id: 30, location_name: 'California')

//get first now
def results = sql.firstRow("select firstname, lastname from PERSON where id=1").firstname
println "First Row First Name: $results"

//query using where class
def janFrequentBuyers = people.findAll { it.location_id > 10 && it.lastname == "Pullara"}
janFrequentBuyers.each{println it}

println "Sort on First Name"
people.sort{it.firstName}.each{println it}

コマンド・プロンプト:

//Command:-
groovy -cp C:\tools\MySql\connector\mysql-connector-java-5.1.14\mysql-connector-java-5.1.14-bin.jar DataSetTest.groovy

結果:

First Row First Name: James
[id:3, firstname:Sam, lastname:Pullara, location_id:30, location_name:California]
Sort on First Name
[id:2, firstname:Bob, lastname:Mcwhirter, location_id:20, location_name:Atlanta]
[id:1, firstname:James, lastname:Strachan, location_id:10, location_name:London]
[id:3, firstname:Sam, lastname:Pullara, location_id:30, location_name:California]

コンソール出力

2 番目のアプローチ
Groovy コンソールで、コンソールからクラスパスに直接 jar を追加して、同じことをテストしました。同じ結果が得られました。

3 番目のアプローチ以下に示すよう
に、Groovy Console でスクリプトをテストしました。@Grab同じ結果が得られました。

@GrabConfig(systemClassLoader=true)
@Grab('mysql:mysql-connector-java:5.1.14')

いずれかのアプローチに従うようにしてください。

注:- Groovy スクリプトには必要ないため、
使用しませんでしたが、テストにも成功しました。static main()

それでも問題が発生する場合は、ここで言及されているように、ルート ローダーを使用して jar をロードしてみてください。

于 2013-06-12T01:25:18.600 に答える