Java Hibernate方法检查表中是否存在行,但不返回行

Java Hibernate方法检查表中是否存在行,但不返回行,java,sql,hibernate,Java,Sql,Hibernate,我需要实现一个DAO方法来检查表中是否存在行,并相应地返回一个布尔值。粗略版本如下所示: public boolean check(Integer bookId) { logger.info(BookDAOImpl.class.getName() + ".check() method called."); return bookId.equals(this.get(bookId).getBookId()); } 我不需要返回找到的行 由于这仅用于演示应用程序,因此我使

我需要实现一个DAO方法来检查表中是否存在行,并相应地返回一个布尔值。粗略版本如下所示:

public boolean check(Integer bookId) {
    logger.info(BookDAOImpl.class.getName() + ".check() method called.");

    return bookId.equals(this.get(bookId).getBookId());
}    
我不需要返回找到的行

由于这仅用于演示应用程序,因此我使用:

@Override
public boolean check(Integer bookId) {
    logger.info(PersonDAOImpl.class.getName() + ".check() method called.");

    try {
        Book book = this.get(bookId);
        return bookId.intValue() == book.getBookId().intValue();
    }
    catch(IndexOutOfBoundsException e) {
        return false;
    }
}    

只需使用hibernate和bookId查询数据库。如果返回任何resultset,则返回true或false。

我猜您是在为了性能而优化检查

让我澄清一下: 获取行有三个步骤: 1.通过网络进行方法调用/请求 2.Oracle扫描并查找匹配的行(带或不带) 索引) 3.复制行数据并将其带回

与(1)和(2)相关的成本是巨大的,而(3)的成本很小。 因此,试图优化返回的数据量是没有意义的

例如,如果仅检查需要120ms,则获取数据可能只需要125ms。 在正常情况下几乎不会有5%的差异

注: -如果您的WHERE条件使用索引,(2)也将变得更少 昂贵的 -如果要选择50到数百列,那么找到一种方法来实现这一点是有意义的

建议:
除非您选择了50多列,否则不要麻烦了。只需获取完整数据并检查resultList.size()。

好建议。这仅适用于演示应用程序。我已经发布了我的最终方法。很高兴能帮上忙。还有一件事:您可能希望捕获NullPointerException,而不是索引越界。此外,您还可以完全省略try catch,如果愿意,只需执行以下操作:return book==null?false:bookId.intValue()==book.getBookId().intValue()<代码>主键上的位置(考虑到bookid是主键)不会很昂贵。我可以知道为什么要实现这种方法吗?这背后的基本思想是什么?根据问题,严格地测试表中是否存在行并相应地返回布尔字段……以及在从
get(bookid)返回后如何确保;没有其他事务提交会话和
bookId
更改。这是一个有效的问题,但由于这只是一个简单的演示应用程序,我并不真正关心并发问题。bookId是关键,所以永远不会改变。好吧,但这不是一个好的做法,我想补充一点。使用
Criteria
API和
Projection
并仅选择一列,而不是选择所有列。