本文将为您提供关于SpringCrudRepositoryfindByInventoryIds的详细介绍,我们还将为您解释ListventoryIdList-等效于IN子句的相关知识,同时,我们还将为
本文将为您提供关于Spring CrudRepository findByInventoryIds的详细介绍,我们还将为您解释List
- Spring CrudRepository findByInventoryIds(List
ventoryIdList)-等效于IN子句 - (转) CrudRepository JpaRepository PagingAndSortingRepository 之间的区别
- com.google.zxing.client.android.history.HistoryActivity的实例源码
- com.google.zxing.client.android.history.HistoryItem的实例源码
- CrudRepository和Hibernate: ~~事务中的~~ save(List ~~)vs save(Entity)~~
Spring CrudRepository findByInventoryIds(List ventoryIdList)-等效于IN子句
在Spring CrudRepository中,我们是否支持字段的“ IN子句”?即类似于以下内容?
findByInventoryIds(List<Long> inventoryIdList)
如果没有这样的支持,可以考虑哪些优雅的选择?触发每个ID的查询可能不是最佳选择。
答案1
小编典典findByInventoryIdIn(List<Long> inventoryIdList)
应该可以。
HTTP请求参数格式如下所示:
Yes ?id=1,2,3No ?id=1&id=2&id=3
JPA存储库关键字它表明这IsIn
是等效的-如果你更喜欢动词以提高可读性-并且JPA还支持NotIn
和IsNotIn
。
(转) CrudRepository JpaRepository PagingAndSortingRepository 之间的区别
1. 简介
本文介绍三种不同的 Spring Data repository 和它们的功能,包含以下三种:
- CrudRepository
- PagingAndSortingRepository
- JpaRepository
简单地说,Spring Data 中的每个 repository 都继承自Repository
接口,但是,除此之外,它们每个又有不同的功能。
2. Spring Data Repositories
首先介绍 JpaRepository
,它继承自 PagingAndSortingRepository
,而 PagingAndSortingRepository
又继承自 CrudRepository
。
每个都有自己的功能:
- CrudRepository 提供 CRUD 的功能。
- PagingAndSortingRepository 提供分页和排序功能
- JpaRepository 提供 JPA 相关的方法,如刷新持久化数据、批量删除。
由于三者之间的继承关系,所以 JpaRepository 包含了 CrudRepository 和 PagingAndSortingRepository 所有的 API。
当我们不需要 JpaRepository 和 PagingAndSortingRepository 提供的功能时,可以简单使用 CrudRepository。
下面我们通过例子更好地理解它们提供的 API。
首先创建 Product 实体:
@Entity
public class Product { @Id private long id; private String name; // getters and setters }
然后实现通过名称查询 Product 的操作:
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> { Product findByName(String productName); }
这样就实现了通过名称查询 Product 的方法,Spring Data Repository 根据方法名自动生成相应的实现。
3. CrudRepository
先看下 CrudRepository
接口的源码:
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> { <S extends T> S save(S entity); T findOne(ID primaryKey); Iterable<T> findAll(); Long count(); void delete(T entity); boolean exists(ID primaryKey); }
方法功能介绍:
- save (...) – 保存多个对象。这里,我们可以传多个对象批量保存。
- findOne (...) – 根据传入的主键值获取单一对象。
- findAll (...) – 查询数据库中所有对象。
- count () – 返回表中记录总数。
- delete (...) – 根据传入的对象删除记录。
- exists (...) – 根据传入的主键值判断对象是否存在。
CrudRepository 接口看起来非常简单,但实际上它提供了所有基本查询保存等操作。
4. PagingAndSortingRepository
PagingAndSortingRepository 接口的源码如下:
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> { Iterable<T> findAll(Sort sort); Page<T> findAll(Pageable pageable); }
该接口提供了 findAll(Pageable pageable)
这个方法,它是实现分页的关键。
使用 Pageable 时,需要创建 Pageable 对象并至少设置下面 3 个参数:
- 1、 每页包含记录数
- 2、 当前页数
- 3、 排序
假设我们要显示第一页的结果集,一页不超过 5 条记录,并根据lastName
升序排序,下面代码展示如何使用 PageRequest 和 Sort 获取这个结果:
Sort sort = new Sort(new Sort.Order(Direction.ASC, "lastName"));
Pageable pageable = new PageRequest(0, 5, sort);
5. JpaRepository
JpaRepository 接口源码:
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> { List<T> findAll(); List<T> findAll(Sort sort); List<T> save(Iterable<? extends T> entities); void flush(); T saveAndFlush(T entity); void deleteInBatch(Iterable<T> entities); }
简单介绍下每个方法的作用:
- findAll () – 获取数据库表中所有实体。
- findAll (…) – 根据条件获取排序后的所有实体。
- save (…) – 保存多个实体。这里可以传入多个对象批量保存。
- flush () – 将所有挂起的任务刷新到数据库。
- saveAndFlush (…) – 保存实体并实时刷新到数据库。
- deleteInBatch (…) – 删除多个实体。这里可以传入多个对象并批量删除。
显然,JpaRepository 接口继承自 PagingAndSortingRepository,PagingAndSortingRepository 继承自 CrudRepository,所以 JpaRepository 拥有 CrudRepository 所有的方法。
6. Spring Data Repositories 的缺点
尽管 Spring Data Repositories 有很多优点,但是它们也有缺点:
- 这种方式把我们的代码和类库以及具体抽象(如:Page 和 Pageable)绑定。它们不是这个类库独有的,但是我们必须小心不要暴露这些内部实现的细节。
- 通过继承 CrudRepository 接口,我们暴露了所有方法。这可能满足大部分情况,但是我们可能会遇到这样的情况:我们希望获得对公开的方法的更细粒度的控制,例如创建一个不包含 save (...) 和 delete (...) 的 ReadOnlyRepository,此时继承 CrudRepository 就不满足要求了。
com.google.zxing.client.android.history.HistoryActivity的实例源码
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); int i = item.getItemId(); if (i == R.id.menu_history) { intent.setClassName(this,HistoryActivity.class.getName()); startActivityForResult(intent,HISTORY_REQUEST_CODE); // case R.id.menu_settings: // intent.setClassName(this,PreferencesActivity.class.getName()); // startActivity(intent); // break; // case R.id.menu_help: // intent.setClassName(this,HelpActivity.class.getName()); // startActivity(intent); // break; } else { return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); switch (item.getItemId()) { case R.id.menu_share: intent.setClassName(this,ShareActivity.class.getName()); startActivity(intent); break; case R.id.menu_history: intent.setClassName(this,HISTORY_REQUEST_CODE); break; case R.id.menu_settings: intent.setClassName(this,PreferencesActivity.class.getName()); startActivity(intent); break; case R.id.menu_help: intent.setClassName(this,HelpActivity.class.getName()); startActivity(intent); break; default: return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); int i = item.getItemId(); if (i == R.id.menu_history) { intent.setClassName(this,HelpActivity.class.getName()); // startActivity(intent); // break; } else { return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); int i = item.getItemId(); if (i == R.id.menu_history) { intent.setClassName(this,HelpActivity.class.getName()); // startActivity(intent); // break; } else { return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); int i = item.getItemId(); if (i == R.id.menu_history) { intent.setClassName(this,HelpActivity.class.getName()); // startActivity(intent); // break; } else { return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); int itemId = item.getItemId(); if (itemId == fakeR.getId("id","menu_share")) { intent.setClassName(this,ShareActivity.class.getName()); startActivity(intent); } else if (itemId == fakeR.getId("id","menu_history")) { intent.setClassName(this,HistoryActivity.class.getName()); startActivityForResult(intent,HISTORY_REQUEST_CODE); } else if (itemId == fakeR.getId("id","menu_settings")) { intent.setClassName(this,PreferencesActivity.class.getName()); startActivity(intent); } else if (itemId == fakeR.getId("id","menu_help")) { intent.setClassName(this,HelpActivity.class.getName()); startActivity(intent); } else { return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); switch (item.getItemId()) { case R.id.menu_share: intent.setClassName(this,ShareActivity.class.getName()); startActivity(intent); break; case R.id.menu_history: intent.setClassName(this,HistoryActivity.class.getName()); startActivityForResult(intent,HISTORY_REQUEST_CODE); break; case R.id.menu_settings: intent.setClassName(this,PreferencesActivity.class.getName()); startActivity(intent); break; case R.id.menu_help: intent.setClassName(this,HelpActivity.class.getName()); startActivity(intent); break; default: return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); int itemId = item.getItemId(); if (itemId == fakeR.getId("id",HelpActivity.class.getName()); startActivity(intent); } else { return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); int itemId = item.getItemId(); if (itemId == fakeR.getId("id",HelpActivity.class.getName()); startActivity(intent); } else { return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); int itemId = item.getItemId(); if (itemId == fakeR.getId("id",HelpActivity.class.getName()); startActivity(intent); } else { return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); int itemId = item.getItemId(); if (itemId == fakeR.getId("id",HelpActivity.class.getName()); startActivity(intent); } else { return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); int itemId = item.getItemId(); if (itemId == fakeR.getId("id",HelpActivity.class.getName()); startActivity(intent); } else { return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); switch (item.getItemId()) { case R.id.menu_share: intent.setClassName(this,ShareActivity.class.getName()); startActivity(intent); break; case R.id.menu_history: intent.setClassName(this,HISTORY_REQUEST_CODE); break; case R.id.menu_settings: intent.setClassName(this,PreferencesActivity.class.getName()); startActivity(intent); break; case R.id.menu_help: intent.setClassName(this,HelpActivity.class.getName()); startActivity(intent); break; default: return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); int itemId = item.getItemId(); if (itemId == fakeR.getId("id",HelpActivity.class.getName()); startActivity(intent); } else { return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); int itemId = item.getItemId(); if (itemId == fakeR.getId("id",HelpActivity.class.getName()); startActivity(intent); } else { return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); int itemId = item.getItemId(); if (itemId == fakeR.getId("id",HelpActivity.class.getName()); startActivity(intent); } else { return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); int itemId = item.getItemId(); if (itemId == R.id.menu_share) { intent.setClassName(this,ShareActivity.class.getName()); startActivity(intent); } else if (itemId == R.id.menu_history) { intent.setClassName(this,HISTORY_REQUEST_CODE); } else if (itemId == R.id.menu_settings) { intent.setClassName(this,PreferencesActivity.class.getName()); startActivity(intent); } else if (itemId == R.id.menu_help) { intent.setClassName(this,HelpActivity.class.getName()); startActivity(intent); } else { return super.onoptionsItemSelected(item); } return true; }
@Override public boolean onoptionsItemSelected(MenuItem item) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); int itemId = item.getItemId(); if (itemId == R.id.menu_share) { intent.setClassName(this,ShareActivity.class.getName()); startActivity(intent); } else if (itemId == R.id.menu_history) { intent.setClassName(this,HistoryActivity.class.getName()); startActivityForResult(intent,HISTORY_REQUEST_CODE); } else if (itemId == R.id.menu_settings) { intent.setClassName(this,PreferencesActivity.class.getName()); startActivity(intent); } else if (itemId == R.id.menu_help) { intent.setClassName(this,HelpActivity.class.getName()); startActivity(intent); } else { return super.onoptionsItemSelected(item); } return true; }
com.google.zxing.client.android.history.HistoryItem的实例源码
@Override public void onActivityResult(int requestCode,int resultCode,Intent intent) { if (resultCode == RESULT_OK && requestCode == HISTORY_REQUEST_CODE && historyManager != null) { int itemNumber = intent .getIntExtra(Intents.History.ITEM_NUMBER,-1); if (itemNumber >= 0) { HistoryItem historyItem = historyManager .buildHistoryItem(itemNumber); decodeOrStoreSavedBitmap(null,historyItem.getResult()); } } }
@Override public void onActivityResult(int requestCode,Intent intent) { if (resultCode == RESULT_OK && requestCode == HISTORY_REQUEST_CODE && historyManager != null) { int itemNumber = intent.getIntExtra(Intents.History.ITEM_NUMBER,-1); if (itemNumber >= 0) { HistoryItem historyItem = historyManager.buildHistoryItem(itemNumber); decodeOrStoreSavedBitmap(null,historyItem.getResult()); } } }
@Override public void onActivityResult(int requestCode,historyItem.getResult()); } } }
@Override public void onActivityResult(int requestCode,historyItem.getResult()); } } }
@Override public void onActivityResult(int requestCode,historyItem.getResult()); } } }
@Override public void onActivityResult(int requestCode,Intent intent) { if (resultCode == RESULT_OK) { if (requestCode == HISTORY_REQUEST_CODE) { int itemNumber = intent.getIntExtra(Intents.History.ITEM_NUMBER,-1); if (itemNumber >= 0) { HistoryItem historyItem = historyManager.buildHistoryItem(itemNumber); decodeOrStoreSavedBitmap(null,historyItem.getResult()); } } } }
@Override public void onActivityResult(int requestCode,historyItem.getResult()); } } } }
@Override public void onActivityResult(int requestCode,Intent intent) { if (resultCode == RESULT_OK) { if (requestCode == HISTORY_REQUEST_CODE) { int itemNumber = intent.getIntExtra(Intents.History.ITEM_NUMBER,-1); if (itemNumber >= 0) { HistoryItem historyItem = historyManager.buildHistoryItem(itemNumber); decodeOrStoreSavedBitmap(null,historyItem.getResult()); } } } }
@Override public void onActivityResult(int requestCode,historyItem.getResult()); } } } }
@Override public void onActivityResult(int requestCode,historyItem.getResult()); } } } }
@Override public void onActivityResult(int requestCode,historyItem.getResult()); } } } }
@Override public void onActivityResult(int requestCode,historyItem.getResult()); } } } }
@Override public void onActivityResult(int requestCode,historyItem.getResult()); } } } }
@Override public void onActivityResult(int requestCode,historyItem.getResult()); } } } }
@Override public void onActivityResult(int requestCode,historyItem.getResult()); } } } }
@Override public void onActivityResult(int requestCode,historyItem.getResult()); } } } }
@Override public void onActivityResult(int requestCode,historyItem.getResult()); } } } }
@Override public void onActivityResult(int requestCode,historyItem.getResult()); } } } }
CrudRepository和Hibernate: ~~事务中的~~ save(List ~~)vs save(Entity)~~
如何解决CrudRepository和Hibernate: ~~事务中的~~ save(List ~~)vs save(Entity)~~?
~~~~
来自SimpleJpaRepository
:
@Transactional
public <S extends T> List<S> More save(Iterable<S> entities) {
List<S> result = new ArrayList<S>();
if (entities == null) {
return result;
}
for (S entity : entities) {
result.add(save(entity));
}
return result;
}
因此,save(Iterable<S> entities)
从某种意义上说,您的第二种业务方法仅对Crud
Repository方法产生了阴影,它会迭代列表并save(S)
代表您进行调用。
只要从您的业务方法中 了 processData
,性能或执行的查询就没有真正的区别。
解决方法
~~~~
如果这样做,会有所不同吗:
@Transactional
public void processData() {
List<MyEntity> entities = ....;
MyEntityRepository.save(entities);
}
与
@Transactional
public void processData() {
List<MyEntity> entities = ....;
for (MyEntity entity : entities) {
MyEntityRepository.save(entity);
}
}
在基础查询和性能方面有什么区别?
关于Spring CrudRepository findByInventoryIds和List
本文标签: