Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @OrderBy被忽略_Java_Jpa_Eclipselink - Fatal编程技术网

Java @OrderBy被忽略

Java @OrderBy被忽略,java,jpa,eclipselink,Java,Jpa,Eclipselink,我试图从OneToMany关系中检索元素的有序列表,但似乎@OrderBy被忽略了?!该应用程序使用eclipselink 2.1。测试数据库是derby嵌入式的 以下是该准则的相关(imho)部分: @Entity public class VotingEntity implements Voting { ... /** * A voting has at least one question. */ @OneToMany(mappedBy =

我试图从OneToMany关系中检索元素的有序列表,但似乎@OrderBy被忽略了?!该应用程序使用eclipselink 2.1。测试数据库是derby嵌入式的

以下是该准则的相关(imho)部分:

@Entity
public class VotingEntity implements Voting {

    ...

    /**
     * A voting has at least one question.
     */
    @OneToMany(mappedBy = "voting", targetEntity = QuestionEntity.class, cascade = { CascadeType.PERSIST,
            CascadeType.REMOVE, CascadeType.REFRESH })
    @OrderBy("groupNumber")
    private List<QuestionEntity> questions = new ArrayList<>();

    ...

}
使用此代码,我创建了一个测试实体:

public class VotingInstance {

    private VotingEntity voting;

    public VotingInstance() {
        voting = new VotingEntity();
        //other setters
        ...     
        voting.setQuestions(createQuestions(voting));
    }

    public VotingEntity getVoting(){
        return voting;
    }

    /**
     * 
     * @return a list with test questions.
     */
    private List<QuestionEntity> createQuestions(VotingEntity voting) {
        List<QuestionEntity> result = new ArrayList<>();
        //question 1
        QuestionEntity q1 = new QuestionEntity();
        q1.setVoting(voting);
        q1.setGroupNumber(3);
        ...
        result.add(q1);
        //question 2
        QuestionEntity q2 = new QuestionEntity();
        q2.setGroupNumber(1);;
        q2.setVoting(voting);
        ...
        result.add(q2);
                //question 3
        QuestionEntity q3 = new QuestionEntity();
        q3.setVoting(voting);
        q3.setGroupNumber(2);
        ...
        result.add(q3);
        return result;

    }

    ...

}
输出是按id排序的(默认情况下没有OrderBY),但是q2应该是第一个(orderNumer=1),q1应该是第二个?! 那么如何获得一个有序列表(我不需要保持inddb的顺序,只有输出是相关的)

更新:一些评论建议添加第三个问题,并创建输出以检查实际的组号。我试过了,一切都很好。我更新了上面的代码。输出为:

q-id: 2 group: 3
q-id: 6 group: 1
q-id: 8 group: 2
根据,OrderBy仅在检索关联时对QuestionEntity实例进行排序。缺少的peice是,您似乎正在创建VotingEntity,并且可能同时重新创建问题列表-JPA仅在从数据库返回时设置顺序。由应用程序来维护它

试着打电话给em.refresh(v)看看我的意思。这将导致从数据库刷新集合


您遇到的问题是JPA允许二级缓存。因此,当您使用无序列表创建VotingEntity时,它会无序地停留在缓存中,并且不会从数据库中获取。为了保证排序,应用程序需要随时维护它,或者在需要重新分配订单时刷新它(和/或清除缓存)。

您确定它不仅仅是按降序排序吗?很难判断测试用例中是否只使用了2个元素。请再测试一下。此外,是否正确设置了组号?您还需要打印它们,以查看它们是否具有您期望的值2和1。1。您应该打印
groupNumber
,查看它们是如何订购的。2.您应该检查
groupNumber
对于所有问题是否都是相同的(例如null)。3.尝试调试以查看生成的查询的外观。我更新了问题和代码-3个问题和输出。因此,我将其称为“em.clear();”,这应该可以清除em的全部错误,不是吗?但我会试试。。。
public class PersistenceTest {

    @Rule
    public TemporaryFolder temp = new TemporaryFolder();

    EntityManager em;

    VotingEntity voting;

    @Before
    public void init() {
        voting = new VotingInstance().getVoting();
        em = new TestDbConfig(temp.getRoot().toString()).createEm();
        em.getTransaction().begin();
        em.persist(voting);
        em.getTransaction().commit();
        em.clear();
    }

    @After
    public void close() {
        em.close();
    }

    @Test
    public void checkVoting() {
        VotingEntity v = em.find(VotingEntity.class, voting.getID());
        for (Question q : v.getQuestions()) {
            System.out.println("q-id: " + q.getID() + " group: " + q.getGroupNumber());
        }
    }
}
q-id: 2 group: 3
q-id: 6 group: 1
q-id: 8 group: 2