Tag: sql

我应该使用复合主键吗?

在Java的JPA中,似乎只有第二类支持复合数据库密钥(通过EmbeddedId或IdClass注释)。 当我读到复合键时,无论语言如何,人们都会不断发现,因为它们是一件坏事。 但我无法理解为什么。 这些天使用复合键是否仍然可以接受? 如果没有,为什么不呢? 我找到了一个同意我的人: http : //weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx 但另一个不这样做的人: http : //weblogs.java.net/blog/bleonard/archive/2006/11/using_composite.html 是仅仅是我,还是人们无法区分复合键的适用与否? 当表不表示实体时,即当它表示连接表时,我看到复合主键很有用。 一个简单的例子: Actor { Id, Name, Email } Movie { Id, Name, Year } Character { Id, Name } Role { Actor, Movie, Character } 这里的Actor,Movie和Character显然受益于Id列作为主键。 但是Role是一个多对多连接表。 我认为创建一个id只是为了识别数据库中的一行是没有意义的。 很明显,主键是{ Actor, Movie, Character } 。 它似乎也是一个相当有限的function,特别是如果连接表中的数据一直在变化,一旦主键序列回绕到0,您就会发现主键冲突。 那么,回到最初的问题,使用复合主键仍然是可以接受的做法吗? 如果没有,为什么不呢?

Hibernate Criteria API:获得n个随机行

我无法弄清楚如何从条件实例中获取n个随机行: Criteria criteria = session.createCriteria(Table.class); criteria.add(Restrictions.eq(‘fieldVariable’, anyValue)); … 那又怎样? 我找不到任何带有Criteria API的文档 这是否意味着我应该使用HQL? 感谢名单! 编辑:我得到的行数: int max = criteria.setProjecxtion(Projections.rowCount()).uniqueResult(); 如何获取索引在0到最大值之间的n个随机行? 再次!

JPA Native Query选择和转换对象

我有一个扩展User的对象Admin 。 默认情况下,两个对象都在我的Derby数据库的User_表中(来自Admin包含字段)。 通常我会像这样选择一个User : CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery(User.class); Root user= query.from(User.class); Predicate predicateId = cb.equal(category.get(“id”), id); query.select(user).where(predicateId); return em.createQuery(query).getSingleResult(); 但是由于我的查询的复杂性,我正在使用这样的本机查询: Query query = em.createNativeQuery(“SELECT USER.* FROM USER_ AS USER WHERE ID = ?”); query.setParameter(1, id); return (User) query.getSingleResult(); 虽然这会抛出一个强制转换exception。 我认为这是由于Admin任何字段。 我的问题是,如何使用具有相同结果的本机查询作为第一个示例选择User (包括@LOB和@ManyToOne (等等)的相同值,因为JPQL查询将返回)?

在将Java Date写入SQL TIMESTAMP列之前,JDBC是否将日期从JVM时区转换为数据库会话时区?

在将Java Date写入SQL TIMESTAMP列之前, JDBC是否将日期从Java虚拟机时区转换为数据库会话的日期? 例如,假设Java虚拟机时区为UTC且数据库会话时区为UTC-5 。 如果Java程序通过将其传递给PreparedStatement#setTimestamp(int, Timestamp)来尝试存储2000-01-01 00:00:00 ,则根据JDBC标准,数据库将存储TIMESTAMP ‘2000-01-01 00:00:00’或TIMESTAMP ‘1999-12-31 19:00:00’ ?

如何在Java中使用预处理语句进行select查询?

我曾多次尝试使用预处理语句,但它返回SQLexception。 这是我的代码: public ArrayList name(String mobile, String password) { ArrayList getdata = new ArrayList(); PreparedStatement stmt = null; try { String login = “select mobile, password from tbl_1 join tbl_2 on tbl_1.fk_id=2.Pk_ID where mobile=? and password=?”; String data = “select * from tbl_2 where password='” + password + “‘”; PreparedStatement preparedStatement = conn.prepareStatement(login); preparedStatement.setString(1, mobile); […]

如何在Java中避免ResultSet被关闭的exception?

只要我的代码到达我的while(rs.next())循环,它就会生成ResultSet已关闭的exception。 导致此exception的原因是什么?如何更正? 编辑:我在我的代码中注意到我在嵌套while(rs.next())与另一个(rs2.next())循环,两个结果集来自同一个数据库,这是一个问题吗?

Postgres数据类型转换

我的数据库是Postgres 8.我需要将数据类型转换为另一个。 这意味着,列数据类型之一是varchar ,需要在SELECT语句中将其与Postgres一起转换为int 。 目前,我获取字符串值并将其转换为Java中的int 。 有什么办法吗? 示例代码将受到高度赞赏。

将字符串日期转换为java.sql.Date

是否可以将string “20110210”转换为java.sql.Date 2011-02-10? 我试过SimpleDateFormat ,我得到了java.text.ParseException: Unparseable date: “20110210” 我究竟做错了什么? 我有新的SimpleDateFormat(“yyyy-MM-dd”)而不是新的SimpleDateFormat(“yyyyMMdd”)

从mysql获取最后一条记录

我正在使用mysql并面临一些问题。 我想检索插入的最后一行。 <> 以下是我创建表格的方法。 create table maxID (myID varchar(4)) 我在其中插入了四个值,如下所示 insert into maxID values (‘A001’) insert into maxID values (‘A002’) insert into maxID values (‘A004’) insert into maxID values (‘A003’) 当我select myID, last_insert_id() as NewID from maxID执行select myID, last_insert_id() as NewID from maxID ,我得到如下输出 myId NewID A001 0 A002 0 A004 0 A003 0 当我尝试下面的代码, […]

将列名称作为PreparedStatement的输入参数

我已经在这里(以及其他论坛)使用了搜索,但是没有找到我正在尝试的答案。 我知道它可以通过其他方式轻松完成,这只是一个小沙箱框架,我正在为大学课程编写代码……在真实环境中,我只需要Spring,Hibernate等。 所以我所做的就是用POJO编写一个小的通用数据访问层,使用通用方法检索,检查或插入数据到数据库(Oracle)。 其中大部分是通过PreparedStatements完成的。 只要我没有连接,这是有效的…是否可以将列作为参数放入? 例: Table A has Attribute X + others Table B has Attribute Y + others PreparedStatement查询SELECT * FROM A,B WHERE “A”.”X” = ? 然后填写“B”。“Y”作为参数…… 数据库不会抛出错误或exception,但执行语句后返回的ResultSet为空。 这是不可能的,还是我只是错过了一些逃脱? 我正在使用PreparedStatement.setString(int index, String value)来填充参数…缺乏想法我可以使用其他setX方法… 同样,在一个真实的项目中,我永远不会自己编写代码,而是使用类似Spring或Hibernate的东西,而不是重新发明轮子,但我认为这是一个有趣的练习,可以自己编写这样一个通用的小数据访问层。