如何通过使用criteria或HQL查询获取表的第一行?
表创建脚本
CREATE TABLE MonthlySubscriber(MSISDN bigint(20)
NOT NULL, MonthOfYear int(11) NOT NULL,
PRIMARY KEY (MSISDN));
Run Code Online (Sandbox Code Playgroud) 我有3个实体,如下所示.我想写一个提取产品的查询.在此查询中,参数是optionValues id的列表.
现在我的问题是如何加入这些实体?
产品:
public class Product{
//other col
@OneToMany(mappedBy = "product")
private Set<Attribute> attributeSet = new HashSet<>();
}
Run Code Online (Sandbox Code Playgroud)
属性:
public class Attribute{
@OneToOne
@JoinColumn(name = "OPTION_VALUE_ID")
private OptionValue optionValue;
@ManyToOne
@JoinColumn(name="PRODUCT_ID",referencedColumnName="id")
private Product product;
}
Run Code Online (Sandbox Code Playgroud)
optionValue:
public class OptionValue{
@Column(name = "id")
private Long id;
@Column(name = "value",updatable = true)
private String value;
}
Run Code Online (Sandbox Code Playgroud)
我写了一个查询,但我认为我的代码不是一个好的解决方案.
Criteria aCriteria = null;
if (!optionValueList.isEmpty()) {
aCriteria = currentSession().createCriteria(Attribute.class, "attribute");
aCriteria.createAlias("attribute.optionValue", "optionValue");
aCriteria.add(Restrictions.in("optionValue.id", optionValueList));
attributes = aCriteria.list();
}
PagingData<Product> pagingData = new PagingData<>(); …Run Code Online (Sandbox Code Playgroud) 我有这样的Bean
Class TestA
{
Map<String,TestB> testBMap;
}
Class TestB
{
String data;
...
}
Run Code Online (Sandbox Code Playgroud)
我想取TestA随着地图数据的testBMap地方key ='test1'.
我怎么能用Hibernate做到这一点.
我试图返回一个实体,其列具有另一个表的计数,该表是一对多关系.我想使用hibernate标准,而不是HQL.
select p.*, (select count(*) from child where child.parentid = p.id) as LEVELS
from parent p
Run Code Online (Sandbox Code Playgroud) 我有一个Hibernate条件调用,我想在一个SQL语句中执行.我正在尝试做的是选择Parent的实例,其中Child具有一系列值的属性(SQL IN子句),所有这些都是在使用外连接加载子项时.这是我到目前为止所拥有的:
Criteria c = session.createCriteria(Parent.class);
c.createAlias("children", "c", CriteriaSpecification.LEFT_JOIN)
.setFetchMode("c", FetchMode.JOIN)
.add(Restrictions.in("c.property", properties));
c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
return c.list();
Run Code Online (Sandbox Code Playgroud)
这是一些示例数据:
Parent
Parent ID
A
B
C
Children
Child ID Parent ID property
... A 0
... A 2
... A 7
... B 1
... C 1
... C 2
... C 3
Run Code Online (Sandbox Code Playgroud)
我想要做的是如果其中一个孩子的属性等于我的绑定参数,则返回父母及其所有孩子.我们假设属性是一个包含{2}的数组.在这种情况下,调用将返回父A和C,但他们的子集只包含元素2.即父[子]:
A [2]&C [2]
我想要的是:
A [0,2,7]&C [1,2 3]
如果这不是一个bug,它似乎是一个破碎的语义.我不知道如何调用A.getChildren()或C.getChildren()并返回1条记录将被认为是正确的 - 这不是一个投影.即如果我扩充查询以使用默认的选择提取,它将返回正确的子集合,带有大量查询的albiet:
c.createAlias("children", "c").add(
Restrictions.in("c.property", properties));
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?如果没有,我怎样才能达到预期的效果呢?
我有以下实体
@Entity
@Table(name = "rule")
public class Rule implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "rule_id")
private Long id;
@ElementCollection(targetClass = Action.class)
@CollectionTable(name = "rule_action", joinColumns = @JoinColumn(name = "rule_id"))
@Enumerated(value = EnumType.STRING)
@Column(name = "action")
private Set<Action> actions;
//After editing as per jbrookover's suggestion adding a new mapping
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "rule_id")
private Set<RuleAction> ruleActions;
}
Run Code Online (Sandbox Code Playgroud)
以下是我的行动
public enum Action {
PHONE, EMAIL, POSTAL,PHONE_OR_EMAIL, SMS;
}
Run Code Online (Sandbox Code Playgroud)
我想获取一个规则列表,其中包含我正在尝试此操作的特定操作集
DetachedCriteria criteria = DetachedCriteria.forClass(Rule.class,"rule");
criteria …Run Code Online (Sandbox Code Playgroud) 我有两个实体:Issue和Issue_Tracker.我正在使用Hibernate 3.6.
SELECT `issues`.`issue_id`,
`issues`.`issue_raised_date`,
`issues`.`issue_description`,
`issue_tracker`.`tracker_status`
FROM `issues`
LEFT JOIN `issue_tracker` ON `issues`.`issue_id` = `issue_tracker`.`issue_id`
WHERE `issues`.`status`="Escalate To"
Run Code Online (Sandbox Code Playgroud)
如何使用Hibernate Criteria实现这一点,最重要的是,我必须将它用于分页.
和My Dao如下显示jqgrid中的问题列表
public List showHelpDeskIssues(DetachedCriteria dc,int from,int size){
Run Code Online (Sandbox Code Playgroud)Session session = HibernateUtil.getSessionFactory().getCurrentSession(); try { Criteria criteria = dc.getExecutableCriteria(session); criteria.setFirstResult(from); criteria.setMaxResults(size); criteria.add(Restrictions.eq("status","Escalate To")); return criteria.list(); } catch (HibernateException e) { e.printStackTrace(); throw e; } }
有关简要说明请参考此问题如何使用struts2在jqgrid中显示两个表数据 - jqgrid插件和hibernate 任何帮助都会很棒.
我从SQL查询:
select e.*
from terminal_remote_deployment e
where id = (select top 1 e1.id
from terminal_remote_deployment e1
where e1.Terminal_info_id = e.Terminal_info_id
order by e1.version desc
);
Run Code Online (Sandbox Code Playgroud)
我试图在HQL中编写它,如下所示:
final StringBuilder hql = new StringBuilder();
hql.append(" from TerminalRemoteDeployment e");
hql.append(" where e.id = (Select TOP 1 e1.id from TerminalRemoteDeployment e1 where e1.terminalInfo.id = e.terminalInfo.id order by e1.version desc)");
Query query = getEntityManager().createQuery(hql.toString());
resultList = (List<TerminalRemoteDeployment>) query.getResultList();
Run Code Online (Sandbox Code Playgroud)
我遇到这种方法的错误.请帮我写一下hibernate的标准,因为我对此很新.
我正在尝试将下面的查询转换为标准 api。
SELECT er from ereturn er JOIN FETCH product_item pi ON pi.ereturn_id = er.id WHERE pi.status = "RECEIVED"
Run Code Online (Sandbox Code Playgroud)
对于这样的事情:
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Ereturn> criteria = builder.createQuery( Ereturn.class );
Root<Ereturn> er = criteria.from(Ereturn.class);
Join<Ereturn, ProductItem> productItemJoin = er.join("productItems", JoinType.LEFT);
Fetch<Ereturn, ProductItem> productItemFetch = er.fetch("productItems", JoinType.LEFT);
List<Predicate> predicates = new ArrayList<>();
predicates.add(builder.equal( productItemJoin.get( "status" ), "RECEIVED"));
criteria.where(
builder.and(predicates.toArray(new Predicate[predicates.size()]))
);
List<Ereturn> ers = em.createQuery( criteria )
.getResultList();
Run Code Online (Sandbox Code Playgroud)
问题是休眠生成这个查询:
select
ereturn0_.id as ...
...
productite6_.id as ...
...
from
ereturn ereturn0_ …Run Code Online (Sandbox Code Playgroud) 我有以下域对象:
class User {
String name
Transaction transaction
static constraints = {
transaction nullable: true
}
}
class Transaction {
boolean successful
User user
static belongsTo = User
}
Run Code Online (Sandbox Code Playgroud)
我想选择所有users没有成功交易的东西.这意味着我希望没有任何transaction(transaction == null)的用户和具有成功值false(transaction.successful == false)的事务的用户.我想使用Criteria API执行此操作(因为这可以与基于用户输入的其他条件结合使用).
我试过这个:
def c = User.createCriteria()
def results = c {
or {
isNull 'transaction'
transaction {
eq 'successful', false
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这只给了我有交易的用户(成功的价值false).但我没有得到交易所在的用户null
以下代码显示了我如何创建一些示例数据:
def createUserAndTransaction(String name, Boolean successful = null) {
User u …Run Code Online (Sandbox Code Playgroud) hibernate ×9
java ×3
hql ×2
subquery ×2
count ×1
criteria-api ×1
grails ×1
grails-orm ×1
join ×1
jointable ×1
jpa ×1
mysql ×1
orm ×1
sql-server ×1