我有两个实体(Dataset和Item),第一个实体包含后者的列表.
@Entity
class Dataset {
@Id long id;
List<Item> items;
}
@Entity
class Item {
@Id long id;
@Temporal Date date;
String someCriteria;
}
Run Code Online (Sandbox Code Playgroud)
现在我期待的任何数据集,这与引用的项目someCriteria ="X"作为最古老的项目中数据集的列表(它的日期是在此之前,此数据集所引用的所有其他人的).
这应该与JPA-2.0的Criteria API一起使用,但作为SQL查询的答案也可以.
这就是它现在的样子:
Subquery<Item> _subquery = p_criteria.subquery(Item.class);
Root<Item> _itemRoot = _subquery.from(Item.class);
_subquery.select(_itemRoot);
// correlate
_subquery.correlate(_datsetRoot);
// type check
Predicate _typeP = p_builder.equal(_itemRoot.get(Item_.someCriteria), "x");
<additional predicates>
...
// reference check
_subquery.where(_typeP);
return p_builder.exists(_subquery);
Run Code Online (Sandbox Code Playgroud)
我想创建子查询,按日期排序并检查第一个子查询.不幸的是,JPA-2.0不允许在子查询(或连接)中进行排序(据我所见).我的第二个想法是获取MAX(date),大多数数据库应该支持这个想法.同样如此,支持MAX,ABS,......仅适用于数字.
编辑:使用一个已排序的子查询,它看起来像这样(MSSQL):
SELECT d.id
FROM Dataset d
WHERE EXISTS …Run Code Online (Sandbox Code Playgroud) 我正在努力使用Criteria API创建查询.以下SQL查询返回我需要的结果:
SELECT * FROM MODEL WHERE MANUFACTURER_ID = 1 AND SHORTNAME LIKE '%SF%' OR LONGNAME LIKE '%SF%';
Run Code Online (Sandbox Code Playgroud)
我使用条件API编写了以下代码:
public List<Model> findAllByManufacturer(Manufacturer manufacturer,
String pattern) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Model> cq = cb.createQuery(Model.class);
Root<Model> m = cq.from(Model.class);
cq.select(m);
Join<Model, Manufacturer> mf = m.join("manufacturer");
Predicate p = cb.equal(mf.get("id"), manufacturer.getId());
p = cb.and(cb.like(cb.upper(m.<String>get("shortName")),
pattern.toUpperCase()));
p = cb.or(cb.equal(cb.upper(m.<String>get("longName")),
pattern.toUpperCase()));
cq.where(p);
return em.createQuery(cq).getResultList();
}
Run Code Online (Sandbox Code Playgroud)
当我从逻辑上思考它时,它应该工作:
Predicate p = cb.equal(mf.get("id"), manufacturer.getId());
Run Code Online (Sandbox Code Playgroud)
WHERE MANUFACTURER_ID = 1
p = cb.and(cb.like(cb.upper(m.<String>get("shortName")),
pattern.toUpperCase()));
Run Code Online (Sandbox Code Playgroud)
和SHORTNAME一样'%SF%'
p = cb.or(cb.equal(cb.upper(m.<String>get("longName")),
pattern.toUpperCase())); …Run Code Online (Sandbox Code Playgroud) 我正在与以下问题争吵两天,希望你能给我一个正确的方向.我在研究过程中发现的教程和示例总是只显示如何在标准api中轻松加入工作.首先,我有两个班:
@Entity
public class Offer {
private String name;
@ManyToOne private Location location;
private String tags;
}
Run Code Online (Sandbox Code Playgroud)
和
@Entity
public class Location {
private String name;
private string tags;
}
Run Code Online (Sandbox Code Playgroud)
因为我需要避免循环引用,所以这些类之间的连接只是单向的.这个类中有很多其他属性,我想根据我的搜索过滤器构建动态查询.以下SQL语句将解释我喜欢做什么:
SELECT l
FROM Offer o
JOIN o.location l
WHERE o.tags LIKE :sometag AND l.tags LIKE :someothertag
Run Code Online (Sandbox Code Playgroud)
用标准api实现这个后,我得到了这段代码:
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Location> criteriaQuery = criteriaBuilder.createQuery(Location.class);
criteriaQuery = criteriaQuery.distinct(true);
Join location;
ArrayList<Predicate> whereList = new ArrayList<Predicate>();
// if filter by offer, use offer as main table and join location table …Run Code Online (Sandbox Code Playgroud) 我正在为汽车经销商开发 Web 应用程序。我有一个包含一组安全枚举的字段的 Car 类。
public class Car {
@Id
@GeneratedValue
private Long id;
@NotNull(message = "{year}")
@Min(value = 1950)
@Max(value = 2020)
@Column(nullable = false)
private int year;
@NotNull()
@Column(nullable = false)
private String make;
@NotNull()
@Column(nullable = false)
private String model;
@NotNull()
@Min(value = 0)
@Max(value = 1000000)
@Column(nullable = false)
private int kilometres;
@Column(nullable = false)
private int price;
@NotNull()
@Enumerated(EnumType.STRING)
private Gearbox gearbox;
@ElementCollection(fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
@CollectionTable(name="SECURITY")
@Column(name="TYPE")
private Set<Security> securityList = new HashSet<Security>();
@NotNull() …Run Code Online (Sandbox Code Playgroud) 我有以下实体:
@Entity
@Table(name = "place_revision")
public class PoiRevision {
@OneToMany(mappedBy = "pk.revision", cascade = {CascadeType.ALL})
private Collection<PoiRevisionCategory> categoryMapping;
// ...
}
@Entity
@Table(name = "place_revision__category")
@AssociationOverrides({
@AssociationOverride(name = "pk.revision",
joinColumns = @JoinColumn(name = "place_revision_id")),
@AssociationOverride(name = "pk.category",
joinColumns = @JoinColumn(name = "category_id"))
})
public class PoiRevisionCategory {
@EmbeddedId
private PoiRevisionCategoryId pk = new PoiRevisionCategoryId();
// ...
}
@Embeddable
public class PoiRevisionCategoryId implements Serializable {
@ManyToOne
private PoiRevision revision;
@ManyToOne
private Category category;
// ...
}
@Entity
@Table(name = "category")
public …Run Code Online (Sandbox Code Playgroud) 假设我有以下示例实体 - 一个是@Embeddable嵌入在另一个中的@Entity:
@Embeddable
public class ContactInfoEntity {
@Column
private String phone;
@Column
private String zipCode;
}
@Entity
@Table(name = "EMPLOYEE")
public class EmployeeEntity {
@Id
@Column(name = "EMPLOYEE_ID")
private Long employeeId;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "phone",
column = @Column(name = "EMPLOYEE_PHONE")),
@AttributeOverride(name = "zipCode",
column = @Column(name = "EMPLOYEE_ZIP_CODE"))
})
private ContactInfoEntity employeeContactInfo;
}
Run Code Online (Sandbox Code Playgroud)
openjpa-maven-plugin 生成的元模型类只包含一个employeeContactInfo变量,而不包含@AttributeOverride列。
现在假设我想这样做:
选择
EMPLOYEE_ID和EMPLOYEE_PHONE其中EMPLOYEE_ZIP_CODE等于“123456”
我如何将其创建为CriteriaQuery?
CriteriaBuilder cb = entityManager.getCriteriaBuilder(); …Run Code Online (Sandbox Code Playgroud) 由于 2.1 版 JPA 支持join on. 我发现了一些如何join on在 JPQL 中使用的示例,但没有用于 Criteria API,这是我的问题:
是
JOIN ON在 Criteria API 中实现的吗?如果是,任何人都可以提供示例吗?
我有这样的事情:
@Entity
public class Person {
@ElementCollection
private List<String> emails;
...
}
Run Code Online (Sandbox Code Playgroud)
如何将以下 JPQL 转换为条件查询:
select p from Person p
where exists (
select 1
from p.emails e
where e like :email
)
Run Code Online (Sandbox Code Playgroud) 我正在尝试在“或”和“和”条件中生成带有多个括号的查询,但没有生成内部括号。外部谓词的括号正确生成,但不是内部谓词的括号。代码:
CriteriaBuilder criteriaBuilder = this.getEntityManager().getCriteriaBuilder();
CriteriaQuery<ConfigurationKey> query = criteriaBuilder.createQuery(ConfigurationKey.class);
Root<ConfigurationKey> configurationKeyRoot = query.from(ConfigurationKey.class);
Join<ConfigurationKey, Customer> configurationKeyCustomerJoin = configurationKeyRoot.join(ConfigurationKey_.customer);
final List<Predicate> predicates = new ArrayList<>();
predicates.add(criteriaBuilder.equal(configurationKeyCustomerJoin.get(Customer_.externalId), customerId));
predicates.add(criteriaBuilder.equal(configurationKeyRoot.get(ConfigurationKey_.configType), configType));
final List<Predicate> orPredicates = new ArrayList<>();
keys.forEach((x, y) -> {
orPredicates.add(
criteriaBuilder.and(
criteriaBuilder.equal(configurationKeyRoot.get(ConfigurationKey_.keyType), x),
criteriaBuilder.equal(configurationKeyRoot.get(ConfigurationKey_.keyValue), y)
)
);
}
);
predicates.add(criteriaBuilder.or(orPredicates.toArray(new Predicate[orPredicates.size()])));
query.where(criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])));
query.select(configurationKeyRoot);
TypedQuery<ConfigurationKey> typedQuery = this.getEntityManager().createQuery(query);
Run Code Online (Sandbox Code Playgroud)
生成的查询:
select
configurat0_.id as id1_1_,
configurat0_.createdAt as createdA2_1_,
configurat0_.updatedAt as updatedA3_1_,
configurat0_.configType as configTy4_1_,
configurat0_.customerId as customer7_1_,
configurat0_.keyType as keyType5_1_,
configurat0_.keyValue as keyValue6_1_ …Run Code Online (Sandbox Code Playgroud) 我正在尝试检查数据库中的列是否不是空字符串或不为null,但是我无法弄清楚如何使用条件构建器查询来获取实际对象。这个SQL的作品:
sampleName is not null and sampleName != ''
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用这样的条件构建器进行操作时:
//这是在私有方法filterBySampleNotEmpty中
cb.notEqual(root.get("sampleName"), "");
Run Code Online (Sandbox Code Playgroud)
在另一个方法中被此方法调用
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Sample> query = criteriaBuilder.createQuery(Sample.class);
Root model = query.from(Sample.class);
List<Predicate> predicates = new ArrayList<>();
predicates.add(filterBySampleNotEmpty(model, criteriaBuilder));
query.select(model).where(predicates.toArray(new Predicate[]{}));
Run Code Online (Sandbox Code Playgroud)
它仍然返回整个列表。