下面列出了怎么用javax.persistence.criteria.CriteriaUpdate的API类实例代码及写法,或者点击链接到github查看源代码。
@Test
public void updateBookPrices() {
log.info("... updateBookPrices ...");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
logBookPrices(em);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaUpdate<Book> update = cb.createCriteriaUpdate(Book.class);
Root<Book> root = update.from(Book.class);
update.set(Book_.price, cb.prod(root.get(Book_.price), 1.1));
Query query = em.createQuery(update);
query.executeUpdate();
logBookPrices(em);
em.getTransaction().commit();
em.close();
}
private void softDelete(T entity, LocalDateTime localDateTime) {
Assert.notNull(entity, "The entity must not be null!");
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaUpdate<T> update = cb.createCriteriaUpdate((Class<T>) domainClass);
Root<T> root = update.from((Class<T>) domainClass);
update.set(DELETED_FIELD, localDateTime);
final List<Predicate> predicates = new ArrayList<Predicate>();
if (entityInformation.hasCompositeId()) {
for (String s : entityInformation.getIdAttributeNames())
predicates.add(cb.equal(root.<ID>get(s),
entityInformation.getCompositeIdAttributeValue(entityInformation.getId(entity), s)));
update.where(cb.and(predicates.toArray(new Predicate[predicates.size()])));
} else
update.where(cb.equal(root.<ID>get(entityInformation.getIdAttribute().getName()),
entityInformation.getId(entity)));
em.createQuery(update).executeUpdate();
}
@Test
public void testCriteriaAPI() {
doInJPA(entityManager -> {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaUpdate<Event> update = builder.createCriteriaUpdate(Event.class);
Root<Event> root = update.from(Event.class);
update
.set(root.get("eventValue"), "100")
.where(
builder.equal(root.get("id"), 1L)
);
entityManager.createQuery(update).executeUpdate();
});
doInJPA(entityManager -> {
Event event = entityManager.find(Event.class, 1L);
assertEquals("100", event.getEventValue());
});
}
private void updateFields(Mode mode, Long delta, Long start, Long stop, String field) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaUpdate<N> update = cb.createCriteriaUpdate(nodeClass);
Root<N> root = update.from(nodeClass);
if (Mode.DOWN.equals(mode)) {
update.set(root.<Long>get(field), cb.diff(root.get(field), delta));
} else if (Mode.UP.equals(mode)) {
update.set(root.<Long>get(field), cb.sum(root.get(field), delta));
}
update.where(getPredicates(cb, root,
cb.greaterThan(root.get(field), start),
cb.lessThan(root.get(field), stop)
));
entityManager.createQuery(update).executeUpdate();
}
private void performMove(Mode mode, Long nodeDelta, Long levelModificator) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaUpdate<N> update = cb.createCriteriaUpdate(nodeClass);
Root<N> root = update.from(nodeClass);
update.set(root.<Long>get(LEVEL), cb.sum(root.get(LEVEL), levelModificator));
if (Mode.DOWN.equals(mode)) {
update.set(root.<Long>get(RIGHT), cb.diff(unMarkRightField(root), nodeDelta));
update.set(root.<Long>get(LEFT), cb.diff(root.get(LEFT), nodeDelta));
} else if (Mode.UP.equals(mode)) {
update.set(root.<Long>get(RIGHT), cb.sum(unMarkRightField(root), nodeDelta));
update.set(root.<Long>get(LEFT), cb.sum(root.get(LEFT), nodeDelta));
}
update.where(
getPredicates(cb, root, cb.lessThan(root.get(RIGHT), 0))
);
entityManager.createQuery(update).executeUpdate();
}
@Test
public void givenNewItemPrice_whenCriteriaUpdate_thenReturnAffectedResult() {
int oldPrice = 10, newPrice = 20;
Session session = HibernateUtil.getHibernateSession();
Item item = new Item(12, "Test Item 12", "This is a description");
item.setItemPrice(oldPrice);
session.save(item);
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaUpdate<Item> criteriaUpdate = cb.createCriteriaUpdate(Item.class);
Root<Item> root = criteriaUpdate.from(Item.class);
criteriaUpdate.set("itemPrice", newPrice);
criteriaUpdate.where(cb.equal(root.get("itemPrice"), oldPrice));
Transaction transaction = session.beginTransaction();
session.createQuery(criteriaUpdate).executeUpdate();
transaction.commit();
Item updatedItem = session.createQuery("FROM Item WHERE itemPrice = " + newPrice, Item.class).getSingleResult();
session.refresh(updatedItem);
assertEquals(newPrice, updatedItem.getItemPrice().intValue());
}
@Override
public Query createQuery(CriteriaUpdate updateQuery) {
checkBlocking();
try (EntityManagerResult emr = getEntityManager()) {
return emr.em.createQuery(updateQuery);
}
}
@Override
@SuppressWarnings("unchecked")
public <Y, X extends Y> CriteriaUpdate<T> set(SingularAttribute<? super T, Y> singularAttribute, X value) {
final Path<Y> attributePath = getRoot().get( singularAttribute );
final Expression valueExpression = value == null
? criteriaBuilder().nullLiteral( attributePath.getJavaType() )
: criteriaBuilder().literal( value );
addAssignment( attributePath, valueExpression );
return this;
}
@Override
public <Y> CriteriaUpdate<T> set(
SingularAttribute<? super T, Y> singularAttribute,
Expression<? extends Y> value) {
addAssignment( getRoot().get( singularAttribute ), value );
return this;
}
@Override
@SuppressWarnings("unchecked")
public <Y, X extends Y> CriteriaUpdate<T> set(Path<Y> attributePath, X value) {
final Expression valueExpression = value == null
? criteriaBuilder().nullLiteral( attributePath.getJavaType() )
: criteriaBuilder().literal( value );
addAssignment( attributePath, valueExpression );
return this;
}
@Override
@SuppressWarnings("unchecked")
public CriteriaUpdate<T> set(String attributeName, Object value) {
final Path attributePath = getRoot().get( attributeName );
final Expression valueExpression = value == null
? criteriaBuilder().nullLiteral( attributePath.getJavaType() )
: criteriaBuilder().literal( value );
addAssignment( attributePath, valueExpression );
return this;
}
@Override
public QueryImplementor createQuery(CriteriaUpdate criteriaUpdate) {
checkOpen();
try {
return criteriaCompiler().compile( (CompilableCriteria) criteriaUpdate );
}
catch ( RuntimeException e ) {
throw exceptionConverter.convert( e );
}
}
@Test
public void testCriteriaAPI() {
try {
doInJPA(entityManager -> {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaUpdate<Event> update = builder.createCriteriaUpdate(Event.class);
Root<Event> root = update.from(Event.class);
update
.set(root.get("eventValue"), "100")
.where(
builder.equal(root.get("id"), 1L)
);
entityManager.createQuery(update).executeUpdate();
});
fail("Should have thrown exception");
} catch (Exception e) {
HibernateException cause = (HibernateException) e.getCause();
assertEquals(
"The query: [" +
"update Event as generatedAlias0 " +
"set generatedAlias0.eventValue = :param0 " +
"where generatedAlias0.id=1L" +
"] attempts to update an immutable entity: [Event]",
cause.getMessage()
);
}
}
@Override
public Integer markNodeIds(NestedNodeInfo<ID> node) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaUpdate<N> update = cb.createCriteriaUpdate(nodeClass);
Root<N> root = update.from(nodeClass);
update
.set(root.<Long>get(RIGHT), markRightField(root))
.where(
getPredicates(cb, root,
cb.greaterThanOrEqualTo(root.get(LEFT), node.getLeft()),
cb.lessThanOrEqualTo(root.get(RIGHT), node.getRight())
));
return entityManager.createQuery(update).executeUpdate();
}
private void doUpdateParentField(ID newParentId, NestedNodeInfo<ID> node) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaUpdate<N> update = cb.createCriteriaUpdate(nodeClass);
Root<N> root = update.from(nodeClass);
update.set(root.get(PARENT_ID), newParentId)
.where(getPredicates(cb, root, cb.equal(root.get(ID), node.getId())));
entityManager.createQuery(update).executeUpdate();
}
private void updateFields(Long from, String fieldName, boolean gte) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaUpdate<N> update = cb.createCriteriaUpdate(nodeClass);
Root<N> root = update.from(nodeClass);
update.set(root.<Long>get(fieldName), cb.sum(root.get(fieldName), INCREMENT_BY));
if(gte) {
update.where(getPredicates(cb, root, cb.greaterThanOrEqualTo(root.get(fieldName), from)));
} else {
update.where(getPredicates(cb, root, cb.greaterThan(root.get(fieldName), from)));
}
entityManager.createQuery(update).executeUpdate();
}
@Override
public void destroyTree() {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaUpdate<N> update = cb.createCriteriaUpdate(nodeClass);
Root<N> root = update.from(nodeClass);
update
.set(root.<Long>get(LEFT), 0L)
.set(root.<Long>get(RIGHT), 0L)
.set(root.<Long>get(LEVEL), 0L)
.where(getPredicates(cb, root));
entityManager.createQuery(update).executeUpdate();
}
@Override
public void resetFirst(N first) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaUpdate<N> update = cb.createCriteriaUpdate(nodeClass);
Root<N> root = update.from(nodeClass);
update
.set(root.<Long>get(LEVEL), 0L)
.set(root.<Long>get(LEFT), 1L)
.set(root.<Long>get(RIGHT), 2L)
.where(getPredicates(cb, root, cb.equal(update.getRoot().get(ID), first.getId())));
entityManager.createQuery(update).executeUpdate();
}
public void update() {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaUpdate<Post> q = cb.createCriteriaUpdate(Post.class);
Root<Post> root = q.from(Post.class);
q.set(root.get("approved"), true)
.where(root.get("id").in(getCheckedList()));
int result = em.createQuery(q).executeUpdate();
log.info("update @" + result);
load();
}
public void update() {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaUpdate<Post> q = cb.createCriteriaUpdate(Post.class);
Root<Post> root = q.from(Post.class);
q.set(root.get("approved"), true)
.where(root.get("id").in(getCheckedList()));
int result = em.createQuery(q).executeUpdate();
log.info("update @" + result);
load();
}
public void update() {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaUpdate<Post> q = cb.createCriteriaUpdate(Post.class);
Root<Post> root = q.from(Post.class);
q.set(root.get("approved"), true)
.where(root.get("id").in(getCheckedList()));
int result = em.createQuery(q).executeUpdate();
log.info("update @" + result);
load();
}
public void update() {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaUpdate<Post> q = cb.createCriteriaUpdate(Post.class);
Root<Post> root = q.from(Post.class);
q.set(root.get("approved"), true)
.where(root.get("id").in(getCheckedList()));
int result = em.createQuery(q).executeUpdate();
log.info("update @" + result);
load();
}
public void update() {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaUpdate<Post> q = cb.createCriteriaUpdate(Post.class);
Root<Post> root = q.from(Post.class);
q.set(root.get("approved"), true)
.where(root.get("id").in(getCheckedList()));
int result = em.createQuery(q).executeUpdate();
log.info("update @" + result);
load();
}
@Override
public Query createQuery(final CriteriaUpdate updateQuery) {
final Timer timer = Op.createQuery.start(this.timer, this);
try {
return getEntityManager().createQuery(updateQuery);
} finally {
timer.stop();
}
}
@Override
public <T> CriteriaUpdate<T> createCriteriaUpdate(Class<T> targetEntity) {
return new ReactiveCriteriaUpdateImpl<>(this);
}
@Override @SuppressWarnings("unchecked")
public <R> Mutiny.Query<R> createQuery(CriteriaUpdate<R> criteriaUpdate) {
return new MutinyQueryImpl<>( delegate.createReactiveQuery( (Criteria<R>) criteriaUpdate) );
}
@Override @SuppressWarnings("unchecked")
public <R> Stage.Query<R> createQuery(CriteriaUpdate<R> criteriaUpdate) {
return new StageQueryImpl<>( delegate.createReactiveQuery( (Criteria<R>) criteriaUpdate) );
}
@Test
public void testCriteriaEntityQuery(TestContext context) {
Author author1 = new Author("Iain M. Banks");
Author author2 = new Author("Neal Stephenson");
Book book1 = new Book("1-85723-235-6", "Feersum Endjinn", author1);
Book book2 = new Book("0-380-97346-4", "Cryptonomicon", author2);
Book book3 = new Book("0-553-08853-X", "Snow Crash", author2);
author1.books.add(book1);
author2.books.add(book2);
author2.books.add(book3);
CriteriaBuilder builder = getSessionFactory().getCriteriaBuilder();
CriteriaQuery<Book> query = builder.createQuery(Book.class);
Root<Book> b = query.from(Book.class);
b.fetch("author");
query.orderBy( builder.asc( b.get("isbn") ) );
CriteriaUpdate<Book> update = builder.createCriteriaUpdate(Book.class);
b = update.from(Book.class);
update.set( b.get("title"), "XXX" );
CriteriaDelete<Book> delete = builder.createCriteriaDelete(Book.class);
b = delete.from(Book.class);
test(context,
openSession()
.thenCompose( session -> session.persist(author1, author2) )
.thenCompose( session -> session.flush() )
.whenComplete( (session,err) -> session.close() )
.thenCompose( v -> openSession() )
.thenCompose( session -> session.createQuery(query).getResultList() )
.thenAccept( books -> {
context.assertEquals( 3, books.size() );
books.forEach( book -> {
context.assertNotNull( book.id );
context.assertNotNull( book.title );
context.assertNotNull( book.isbn );
} );
} )
.thenCompose( v -> openSession() )
.thenCompose( session -> session.createQuery(update).executeUpdate() )
.thenCompose( v -> openSession() )
.thenCompose( session -> session.createQuery(delete).executeUpdate() )
);
}
@Test
public void testCriteriaEntityQueryWithParam(TestContext context) {
Author author1 = new Author("Iain M. Banks");
Author author2 = new Author("Neal Stephenson");
Book book1 = new Book("1-85723-235-6", "Feersum Endjinn", author1);
Book book2 = new Book("0-380-97346-4", "Cryptonomicon", author2);
Book book3 = new Book("0-553-08853-X", "Snow Crash", author2);
author1.books.add(book1);
author2.books.add(book2);
author2.books.add(book3);
CriteriaBuilder builder = getSessionFactory().getCriteriaBuilder();
CriteriaQuery<Book> query = builder.createQuery(Book.class);
Root<Book> b = query.from(Book.class);
b.fetch("author");
ParameterExpression<String> t = builder.parameter(String.class);
query.where( builder.equal( b.get("title"), t ) );
query.orderBy( builder.asc( b.get("isbn") ) );
CriteriaUpdate<Book> update = builder.createCriteriaUpdate(Book.class);
b = update.from(Book.class);
update.where( builder.equal( b.get("title"), t ) );
update.set( b.get("title"), "XXX" );
CriteriaDelete<Book> delete = builder.createCriteriaDelete(Book.class);
b = delete.from(Book.class);
delete.where( builder.equal( b.get("title"), t ) );
test(context,
openSession()
.thenCompose( session -> session.persist(author1, author2) )
.thenCompose( session -> session.flush() )
.whenComplete( (session,err) -> session.close() )
.thenCompose( v -> openSession() )
.thenCompose( session -> session.createQuery(query)
.setParameter( t, "Snow Crash")
.getResultList() )
.thenAccept( books -> {
context.assertEquals( 1, books.size() );
books.forEach( book -> {
context.assertNotNull( book.id );
context.assertNotNull( book.title );
context.assertNotNull( book.isbn );
context.assertEquals( "Snow Crash", book.title );
} );
} )
.thenCompose( v -> openSession() )
.thenCompose( session -> session.createQuery(update)
.setParameter( t, "Snow Crash")
.executeUpdate() )
.thenCompose( v -> openSession() )
.thenCompose( session -> session.createQuery(delete)
.setParameter( t, "Snow Crash")
.executeUpdate() )
);
}
@Test
public void testCriteriaEntityQueryWithNamedParam(TestContext context) {
Author author1 = new Author("Iain M. Banks");
Author author2 = new Author("Neal Stephenson");
Book book1 = new Book("1-85723-235-6", "Feersum Endjinn", author1);
Book book2 = new Book("0-380-97346-4", "Cryptonomicon", author2);
Book book3 = new Book("0-553-08853-X", "Snow Crash", author2);
author1.books.add(book1);
author2.books.add(book2);
author2.books.add(book3);
CriteriaBuilder builder = getSessionFactory().getCriteriaBuilder();
CriteriaQuery<Book> query = builder.createQuery(Book.class);
Root<Book> b = query.from(Book.class);
b.fetch("author");
ParameterExpression<String> t = builder.parameter(String.class, "title");
query.where( builder.equal( b.get("title"), t ) );
query.orderBy( builder.asc( b.get("isbn") ) );
CriteriaUpdate<Book> update = builder.createCriteriaUpdate(Book.class);
b = update.from(Book.class);
update.where( builder.equal( b.get("title"), t ) );
update.set( b.get("title"), "XXX" );
CriteriaDelete<Book> delete = builder.createCriteriaDelete(Book.class);
b = delete.from(Book.class);
delete.where( builder.equal( b.get("title"), t ) );
test(context,
openSession()
.thenCompose( session -> session.persist(author1, author2) )
.thenCompose( session -> session.flush() )
.whenComplete( (session,err) -> session.close() )
.thenCompose( v -> openSession() )
.thenCompose( session -> session.createQuery(query)
.setParameter("title", "Snow Crash")
.getResultList() )
.thenAccept( books -> {
context.assertEquals( 1, books.size() );
books.forEach( book -> {
context.assertNotNull( book.id );
context.assertNotNull( book.title );
context.assertNotNull( book.isbn );
context.assertEquals( "Snow Crash", book.title );
} );
} )
.thenCompose( v -> openSession() )
.thenCompose( session -> session.createQuery(update)
.setParameter("title", "Snow Crash")
.executeUpdate() )
.thenCompose( v -> openSession() )
.thenCompose( session -> session.createQuery(delete)
.setParameter("title", "Snow Crash")
.executeUpdate() )
);
}