【问题标题】:JDO app engine typesafe ancestor queryJDO 应用引擎类型安全祖先查询
【发布时间】:2015-02-14 05:17:30
【问题描述】:

我正在使用带有 DataNucleus JDO 类型安全查询的 App Engine。是否可以使用 DataNucleus 构建类型安全的祖先查询?例如此应用程序引擎link 的代码将组织称为祖先,Java 中的类型安全查询是什么?

class Organization(db.Model):
    name = db.StringProperty()
class Person(db.Model):
    given_name = db.StringProperty()
    surname = db.StringProperty()
class MainPage(webapp2.RequestHandler):
    def post(self):
        org = Organization.get_or_insert('ateam', name='ATeam')
        person = Person(parent=org)
        person.given_name='GI'
        person.surname='Joe'
        person.put()
        q = db.GqlQuery("SELECT * FROM Person WHERE ANCESTOR IS :1 ", org)
        people = []
        for p in q.run():
            people.append({'given_name': p.given_name,
                        'surname': p.surname})

【问题讨论】:

  • 类型安全查询只是生成特定 JDOQL 的一种方式。定义你要使用的JDOQL是什么,然后不使用GAE的人可以从纯JDO的角度来回答。
  • 我想构建这个查询,其中 org 引用了有问题引用的代码示例中的祖先:("SELECT * FROM Person WHERE ANCESTOR IS :1", org)
  • 那不是 JDOQL。 "SELECT FROM Person WHERE field = :param" 是 JDOQL。
  • 这正是我想知道的 DataNucleus 是否支持祖先查询。尽管这是与 Google App Engine Datastore 一起使用的重要信息,但没有关于此的文档。但看起来 DataNucleus 不支持这一点。最好知道是否支持这种类型的查询,即使这意味着它不受类型安全的支持——至少 DataNucleus 应该支持这种祖先查询功能。感谢您的回复。
  • FWIW "DataNucleus" 与 GAE 无关;插件“datanucleus-appengine”是谷歌的。 DataNucleus 是一个单独的项目,它对 GAE 一无所知,只是提供低级的东西。您可以轻松查看他们的问题跟踪器并查看 code.google.com/p/datanucleus-appengine/issues/detail?id=14 这可能是也可能不是这个“祖先”的东西

标签: jdo google-cloud-datastore datanucleus


【解决方案1】:

是的,Datanucleus 有一个类型安全的东西,它的灵感来自QueryDSL。 您可以在 Scala 中看到下面的示例:

def querySingleRecords(jdbcDriver: String, jdbcUrl: String, username: String, password: String): Unit = {
  import javax.jdo.JDOHelper
  import scala.collection.JavaConverters._
  import org.datanucleus.api.jdo.JDOPersistenceManager

  val pu = props(jdbcDriver, jdbcUrl, username, password)

  val pmf = JDOHelper.getPersistenceManagerFactory(pu.asJava)
  val pm  = pmf.getPersistenceManager.asInstanceOf[JDOPersistenceManager]

  import model.{Identifier, QIdentifier}
  import org.datanucleus.query.typesafe.TypesafeQuery

  val tq: TypesafeQuery[Identifier] = pm.newTypesafeQuery(classOf[Identifier])
  val q: QIdentifier = QIdentifier.candidate()

  def find(symbol: String): Unit = {
    val i: Identifier =
      tq
        .filter(q.symbol.eq(symbol))
        .executeUnique()
        .asInstanceOf[Identifier]
    assert(symbol == i.symbol, s""""%s" not equal to "%s"""".format(symbol, i.symbol))

    if(debug) {
      println("%s -> %d".format(i.symbol, i.fk))
    }
  }

  find("PETR4.SA")
  find("ACIM")
  find("ZVV")
  find("AAIT")
  find("ZUMZ")
  find("AAAIF.OB")
  find("ZYXI.OB")
  find("AALC34.SA")
  find("ZURI9.SA")
}

有关使用它的完整示例,包括一个大的 build.sbt 文件,该文件执行生成元类和运行字节码增强器的所有魔力,请查看

http://github.com/frgomes/poc-scala-datanucleus

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2012-02-20
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多