Java 不必对所有记录执行循环,从数据库中检索特定数据的最有效方法是什么?
我想问一下,在不在所有记录中执行for循环的情况下,从数据库中搜索特定数据的最有效方法是什么 我有一个关于java spring的项目,我有一个实体: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"
@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的基本介绍,因为类和成员的命名都是非标准的。