Datastore KeyFactory生成的ID和JPQL限制?

时间:2013-12-25 23:10:42

标签: google-app-engine jpa datanucleus google-cloud-endpoints

我在处理项目时遇到了一种奇怪的行为(Google Cloud Endpoints + Datanucleus JPA)。 我想使用KeyFactory.createKeyString(String kind, String name)方法维护无主实体的ID,但在对这些ID执行查询时会出现奇怪的行为。

Parent.java

@Entity
public class Parent {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Unowned
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Child child;

    // constructors, getters and setters
}

Child.java

@Entity
public class Child {

    @Id
    private String id;

    @Basic(fetch = FetchType.EAGER)
    private String name;

    public Child() {}

    public Child(String name) {
        this.name = name;
        this.id = KeyFactory.createKeyString("Child", name);
        //this.id = id.substring(0, id.length() - 1);  // magic line!
    }

    // getters and setters
}

JPQL查询"select p from Parent p join p.child c where c.id = :childId"

现在问题如下:
*如果魔术线被注释掉,我总是从查询中得到一个空列表 *如果魔术线未被注释,一切都很完美。

有关信息:生成的ID通常约为40到50个字符,并且是HTML安全的(仅限字母数字)。以下是使用KeyFactory方法生成的ID的示例:agR0ZXN0chALEgZBcnRpc3QiBERhbGkM

有人可以解释这种奇怪的行为吗?

更新
我甚至尝试用id = id + "a";或任何其他角色替换魔术线,这也是有效的。这意味着它绝对不是尺寸限制问题。

0 个答案:

没有答案