Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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 不必对所有记录执行循环,从数据库中检索特定数据的最有效方法是什么?_Java_Sql_Database_Spring_Performance - Fatal编程技术网

Java 不必对所有记录执行循环,从数据库中检索特定数据的最有效方法是什么?

Java 不必对所有记录执行循环,从数据库中检索特定数据的最有效方法是什么?,java,sql,database,spring,performance,Java,Sql,Database,Spring,Performance,我想问一下,在不在所有记录中执行for循环的情况下,从数据库中搜索特定数据的最有效方法是什么 我有一个关于java spring的项目,我有一个实体: @Entity @Table(name = "USERS") public class USERS { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "UID") private Integer id; @Column(name = "FName"

我想问一下,在不在所有记录中执行for循环的情况下,从数据库中搜索特定数据的最有效方法是什么

我有一个关于java spring的项目,我有一个实体:

@Entity  
@Table(name = "USERS") public class USERS  {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "UID") 
private Integer id;

@Column(name = "FName") 
private String firstName;

@Column(name = "SName") 
private String secondName;

@Column(name = "TName") 
private String thirdName;

@Column(name = "LName") 
private String fourthName;

@Column(name = "Email") 
private String email;

@Column(name = "PW") 
private String password;

@Column(name = "MNumber") 
private String mobileNumber;

@Column(name = "ISDeleted") 
private boolean isUserDeleted;


//---------------------- Getters and Setters ----------------------
我做了这个服务:

public List<USERS> findAllActive() {
    List<USERS> usersList = new ArrayList<USERS>();
    for (USERS users: usersRepository.findAll()){
        if (!users.isUserDeleted()){
            usersList.add(users);
        }
    }
    return usersList;
}
public List findAllActive(){
List usersList=new ArrayList();
for(用户:usersRepository.findAll()){
如果(!users.isUserDeleted()){
usersList.add(用户);
}
}
返回用户列表;
}
比如,;我为用户提供了一个属性,无论他是否处于活动状态


那么我的问题,;获取特定数据(如从数据库中检索所有活动用户)的最有效方法是什么,而无需执行上述代码中的for循环?因为如果用户列表为100万或更多,则可能存在性能问题。

假设您使用的是JpaRepository,则可以创建自定义查询

@Query("SELECT u FROM USERS u WHERE u.userDeleted = false") 

List<USERS> findNotDeletedUsers();
@Query(“从用户u中选择u,其中u.userDeleted=false”)
列出findNotDeletedUsers();

然后调用
usersRepository.findNotDeletedUsers()

假设您正在使用JpaRepository,那么您可以创建自定义查询

@Query("SELECT u FROM USERS u WHERE u.userDeleted = false") 

List<USERS> findNotDeletedUsers();
@Query(“从用户u中选择u,其中u.userDeleted=false”)
列出findNotDeletedUsers();

然后调用
usersRepository.findNotDeletedUsers()

首先,在要搜索的字段上使用索引(如果列只有两个不同的值,这对您没有多大帮助,但是如果值具有高稀疏性,则会产生巨大的差异)

然后,定义一个使用索引字段的查询方法(如果您使用的是spring数据,则如下所示)

public interface UsersRepository扩展了crudepository{
删除列表FindUserByIsDeleted(布尔删除);
列出FindUserByFName(字符串名称);
列出FindUserByFName和deleted(字符串名称,布尔删除);
}

对索引字段的查询将利用基础索引并提供有效的访问计划(因此,您不会为了提取与给定条件匹配的实体子集而扫描整个表)。

首先,对要搜索的字段使用索引(如果列只有两个不同的值,这对您没有多大帮助,但是如果值具有高稀疏性,则会产生巨大的差异)

然后,定义一个使用索引字段的查询方法(如果您使用的是spring数据,则如下所示)

public interface UsersRepository扩展了crudepository{
删除列表FindUserByIsDeleted(布尔删除);
列出FindUserByFName(字符串名称);
列出FindUserByFName和deleted(字符串名称,布尔删除);
}

对索引字段的查询将利用基础索引并提供有效的访问计划(因此,您不会为了提取与给定条件匹配的实体子集而扫描整个表).

来自@Madis的解决方案是可以的。但是,如果您始终希望获得在所有查询中未删除的用户,则可以在实体上指定它:

@Entity 
@Table(name = "USERS")
@Where("ISDeleted = false")
public class USERS  {

因此,现在条件“ISDeleted=false”将自动附加到UserRepository的所有查询中。您可以使用usersRepository.findAll()而不是。

来自@Madis的解决方案是可以的。但是,如果您始终希望获得在所有查询中未删除的用户,可以在实体上指定它:

@Entity 
@Table(name = "USERS")
@Where("ISDeleted = false")
public class USERS  {

因此,现在条件“ISDeleted=false”将自动附加到UserRepository的所有查询中。您可以使用usersRepository.findAll()而不是。

您不需要指定任何sql查询或where子句。Crudepository将自动为您执行此操作。只需使用以下代码并根据需要传递true/false即可

List<Users> findIsUserDeleted(boolean isDeleted)
列表FindUserDeleted(布尔值isDeleted)

您不需要指定任何sql查询或where子句。Crudepository将自动为您指定。只需使用下面的代码并根据需要传递true/false即可

List<Users> findIsUserDeleted(boolean isDeleted)
列表FindUserDeleted(布尔值isDeleted)

是的,您用
sql
标记了您的问题-现在是使用它的时候了。“WHERE ISDeleted=false”的美妙之处,但我有点怀疑你需要一些其他的过滤criteria@ScaryWombat或者基于所示的类,可能是JPQL。但是在任何一种情况下,OP都应该经过Java的基本介绍,因为类和成员的命名都是非标准的。是的,你用
sql
-标记了你的问题-现在是使用它的时候了y表示“WHERE ISDeleted=false”,但我怀疑您需要一些其他过滤criteria@ScaryWombat或者基于所示的类,可能是JPQL。但是在任何一种情况下,OP都应该经过Java的基本介绍,因为类和成员的命名都是非标准的。