Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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 对API的并发调用以返回不同的对象_Java_Hibernate - Fatal编程技术网

Java 对API的并发调用以返回不同的对象

Java 对API的并发调用以返回不同的对象,java,hibernate,Java,Hibernate,我有下面的场景 查询结果: student1 subject1 marks1 student2 subject1 marks3 ... ... API代码如下所示 StudentObj getStudentInfo() { List<StudentObj> stObj = StudentDAO.getRows(); // for (StudentObj s : stObj) { //What should I write here??

我有下面的场景

查询结果:

student1  subject1  marks1
student2  subject1  marks3
...
...
API代码如下所示

StudentObj getStudentInfo() {
    List<StudentObj> stObj = StudentDAO.getRows(); //

    for (StudentObj s : stObj) {
       //What should I write here??
    }
}
第一个调用应该能够对student1起作用,第二个并发调用应该能够对student2起作用


编辑:根据注释进行更改。(我无法编辑查询,如果有帮助,客户端getStudentInfo无法传递id)。

查看下面的代码是否有帮助。这里您需要做的就是确保sequenceNumber被分配了一个正确的起始值。根据你提供的信息,这是我能提供的最好的了

我仍然不明白为什么在无法修改查询时提到hibernate。顺便问一下,您的查询是如何编写的?我认为有可能使用Hibernate过滤器,但您仍然需要在某处维护sequenceNumber。在不了解更多细节的情况下,很难提供适当的解决方案

class SomeClass 
{
    private final static AtomicLong sequenceNumber = new AtomicLong(0);
    public static long next() 
    { 
        return sequenceNumber.getAndIncrement(); 
    }

    StudentObj getStudentInfo() 
    {
        List<StudentObj> stObj = StudentDAO.getRows(); //

        for (StudentObj s : stObj) 
        {
            long filter = next();
           //use filter to send the appropriate student info
        }
    }
}
class-SomeClass
{
私有最终静态AtomicLong sequenceNumber=新的AtomicLong(0);
公共静态长next()
{ 
返回sequenceNumber.getAndIncrement();
}
StudentObj getStudentInfo()
{
List stObj=StudentDAO.getRows()//
对于(StudentObj s:stObj)
{
长过滤器=下一个();
//使用筛选器发送适当的学生信息
}
}
}

查看下面的代码是否有帮助。这里您需要做的就是确保sequenceNumber被分配了一个正确的起始值。根据你提供的信息,这是我能提供的最好的了

我仍然不明白为什么在无法修改查询时提到hibernate。顺便问一下,您的查询是如何编写的?我认为有可能使用Hibernate过滤器,但您仍然需要在某处维护sequenceNumber。在不了解更多细节的情况下,很难提供适当的解决方案

class SomeClass 
{
    private final static AtomicLong sequenceNumber = new AtomicLong(0);
    public static long next() 
    { 
        return sequenceNumber.getAndIncrement(); 
    }

    StudentObj getStudentInfo() 
    {
        List<StudentObj> stObj = StudentDAO.getRows(); //

        for (StudentObj s : stObj) 
        {
            long filter = next();
           //use filter to send the appropriate student info
        }
    }
}
class-SomeClass
{
私有最终静态AtomicLong sequenceNumber=新的AtomicLong(0);
公共静态长next()
{ 
返回sequenceNumber.getAndIncrement();
}
StudentObj getStudentInfo()
{
List stObj=StudentDAO.getRows()//
对于(StudentObj s:stObj)
{
长过滤器=下一个();
//使用筛选器发送适当的学生信息
}
}
}

编辑:同步方法,保留学生迭代器,并为每次调用返回下一个迭代器

Iterator<StudentObj> students;

synchronized StudentObj getStudentInfo() {
    if (null == students || !students.hasNext()) {
        students = StudentDAO.getRows().iterator();
    }
    return students.next();
}
Iterator学生;
同步的StudentObj getStudentInfo(){
if(null==students | |!students.hasNext()){
students=StudentDAO.getRows().iterator();
}
返回学生。下一步();
}

编辑:同步方法,保留学生迭代器,并为每次调用返回下一个迭代器

Iterator<StudentObj> students;

synchronized StudentObj getStudentInfo() {
    if (null == students || !students.hasNext()) {
        students = StudentDAO.getRows().iterator();
    }
    return students.next();
}
Iterator学生;
同步的StudentObj getStudentInfo(){
if(null==students | |!students.hasNext()){
students=StudentDAO.getRows().iterator();
}
返回学生。下一步();
}

你是在问如何在hibernate中使用过滤器吗?不是,但我应该如何使用锁(如果正确的话)将不同的学生对象返回给API的客户端。显然,我可能误解了你的问题。您能提供更多详细信息吗?查询返回如上所示的结果,包括学生、科目和相应的分数。让我们调用API getStudentInfo(),如果调用getStudentInfo,那么它应该在student1行上运行,而同时,如果调用getStudentInfo,那么它应该能够在student2上运行。请告诉我,如果此帮助仅在发出并发请求时才提供,则它应返回“student2”数据,否则(如果没有并发请求,则它应返回“student1”数据?您是否询问如何将筛选器与hibernate一起使用?否,但我应如何使用锁(如果正确)将不同的学生对象返回给API的客户端。显然,我可能误解了您的问题。您能提供更多详细信息吗?查询返回如上所示的结果,包括学生、科目和相应的分数。让我们调用API getStudentInfo(),如果调用getStudentInfo,则它应该在student1行上运行,而如果同时调用getStudentInfo,则它应该能够在student2上运行。请告诉我,这是否有帮助仅当发出并发请求时,它应该返回“student2”数据,否则(如果没有并发请求,则应该返回)“student1”数据?问题是方法签名不能更改,因为它意味着客户端代码的更改问题是方法签名不能更改,因为它意味着客户端代码的更改